- Home /
help with shooting projectile along a curve path
hey guys, so i been trying to find a way to shoot projectiles along a curve path . and i found this tutorial on youtube which was really good. here (https://www.youtube.com/watch?v=IvT8hjy6q4o)
i also uploaded the project in case you wanted to check it out. here (http://www.mediafire.com/file/z5zfqbcnpznnbsh/arc+luncher.unitypackage)
but there is problem with this script .if i move the target object somewhere above the starting point the curved path will be disappeared and i get couple of errors.in fact when ever the path is about to become a straight line the errors will pop up . here is the screenshot of errors (https://ibb.co/vZ5JTZ2) and here is a gif file to show when the problem shows up (https://i.stack.imgur.com/ibCD9.gif) and finally here is the code responsible for calculating the curve path a lunching projectiles.
public Transform startPoint;
public Transform target;
public int resolution = 30;
public float curveHight = 25;
public float gravity = -18;
public Rigidbody bullet;
public LineRenderer lineRenderer;
void Start()
{
}
void Update() {
DrawPath();
if (Input.GetKeyDown(KeyCode.Space))
{
Launch();
}
}
void Launch()
{
Rigidbody clone = Instantiate(bullet, startPoint.position, Quaternion.identity);
Physics.gravity = Vector3.up * gravity;
clone.velocity = CalculateLaunchData().initialVelocity;
}
LaunchData CalculateLaunchData()
{
float displacementY = target.position.y - startPoint.position.y;
Vector3 displacementXZ = new Vector3(target.position.x - startPoint.position.x, 0, target.position.z - startPoint.position.z);
float time = Mathf.Sqrt(-2 * curveHight / gravity) + Mathf.Sqrt(2 * (displacementY - curveHight) / gravity);
Vector3 velocityY = Vector3.up * Mathf.Sqrt(-2 * gravity * curveHight);
Vector3 velocityXZ = displacementXZ / time;
return new LaunchData(velocityXZ + velocityY * -Mathf.Sign(gravity), time);
}
void DrawPath()
{
LaunchData launchData = CalculateLaunchData();
Vector3 previousDrawPoint = startPoint.position;
for (int i = 1; i <= resolution; i++)
{
float simulationTime = i / (float)resolution * launchData.timeToTarget;
Vector3 displacement = launchData.initialVelocity * simulationTime + Vector3.up * gravity * simulationTime * simulationTime / 2f;
Vector3 drawPoint = startPoint.position + displacement;
Debug.DrawLine(previousDrawPoint, drawPoint, Color.green);
previousDrawPoint = drawPoint;
lineRenderer.positionCount = resolution;
lineRenderer.SetPosition(i - 1, drawPoint);
}
}
struct LaunchData
{
public readonly Vector3 initialVelocity;
public readonly float timeToTarget;
public LaunchData(Vector3 initialVelocity, float timeToTarget)
{
this.initialVelocity = initialVelocity;
this.timeToTarget = timeToTarget;
}
}
}
so,any idea what might be causing the the problem?
Answer by xxmariofer · Jun 03, 2019 at 01:55 PM
that error is because displacementY is higher than the gravity, so that ends up with a negative value and you cant do mathf.sqrt of negative values, thats giving you an inifint vlue and you cant move objects to infinite positions so is giving the assetion code, try changing your calculatelaunchdata function to this, but this is just clamping so is not negative in case you want the curve to be negative you will need some extra work code:
LaunchData CalculateLaunchData()
{
float displacementY = target.position.y - startPoint.position.y;
Vector3 displacementXZ = new Vector3(target.position.x - startPoint.position.x, 0, target.position.z - startPoint.position.z);
float value = (displacementY - curveHight) / gravity;
float clampedCurve = Mathf.Clamp(value, 0, value);
float time = Mathf.Sqrt(-2 * curveHight / gravity) + Mathf.Sqrt(2 * clampedCurve);
Vector3 velocityY = Vector3.up * Mathf.Sqrt(-2 * gravity * curveHight);
Vector3 velocityXZ = displacementXZ / time;
return new LaunchData(velocityXZ + velocityY * -Mathf.Sign(gravity), time);
}
THAN$$anonymous$$S a lot man i been struggling with this for days now and you just solve it (: