Untitled
unknown
csharp
a year ago
3.4 kB
22
Indexable
using UnityEngine;
using System.Collections.Generic;
public class Launcher : MonoBehaviour
{
[SerializeField] private float upRange = 5;
[SerializeField] private int resolution = 20;
[SerializeField] private bool useParabolicCurve = true;
[SerializeField] private LayerMask collisionMask;
[SerializeField] private Transform endPoint;
private List<Vector3> trajectoryPoints = new List<Vector3>();
[SerializeField] private float launchDuration = 2.0f;
void OnDrawGizmos()
{
if (useParabolicCurve)
{
DrawParabolicCurve();
}
else
{
DrawStraightLine();
}
}
void DrawParabolicCurve()
{
Vector3 startPos = transform.position;
Vector3 previousPos = startPos;
trajectoryPoints.Clear();
for (int i = 1; i <= resolution; i++)
{
float t = (float)i / resolution;
Vector3 point = CalculateParabolaPoint(startPos, t, endPoint.position);
trajectoryPoints.Add(point);
Gizmos.color = Color.yellow;
Gizmos.DrawSphere(point, 0.1f);
if (Physics.Raycast(previousPos, point - previousPos, out RaycastHit hit, Vector3.Distance(previousPos, point), collisionMask))
{
Gizmos.color = Color.red;
Gizmos.DrawLine(previousPos, hit.point);
break;
}
Gizmos.color = Color.blue;
Gizmos.DrawLine(previousPos, point);
previousPos = point;
}
}
void DrawStraightLine()
{
Vector3 startPos = transform.position;
Vector3 endPos = endPoint.position;
Vector3 previousPos = startPos;
trajectoryPoints.Clear();
for (int i = 1; i <= resolution; i++)
{
float t = (float)i / resolution;
Vector3 point = Vector3.Lerp(startPos, endPos, t);
trajectoryPoints.Add(point);
Gizmos.color = Color.yellow;
Gizmos.DrawSphere(point, 0.1f);
Gizmos.color = Color.blue;
Gizmos.DrawLine(previousPos, point);
previousPos = point;
}
}
Vector3 CalculateParabolaPoint(Vector3 startPos, float t, Vector3 endPos)
{
Vector3 horizontalPoint = Vector3.Lerp(startPos, endPos, t);
float parabolaHeight = 4 * upRange * t * (1 - t);
float verticalPoint = Mathf.Lerp(startPos.y, endPos.y, t) + parabolaHeight;
return new Vector3(horizontalPoint.x, verticalPoint, horizontalPoint.z);
}
public List<Vector3> GetTrajectoryPoints()
{
return trajectoryPoints;
}
private void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
MoveAction moveAction = other.transform.parent.Find("Actions/Move").GetComponent<MoveAction>();
LaunchPlayer(moveAction);
}
}
public void LaunchPlayer(MoveAction playerMoveAction)
{
if (playerMoveAction != null)
{
List<Vector3> trajectory = GetTrajectoryPoints();
playerMoveAction.StartLaunch(trajectory.ToArray(), launchDuration);
}
}
}
Editor is loading...
Leave a Comment