I created this version which uses a target position and t (time 0-1).
I would loop this function in an update function if (t < 1) tif (t < 1) t would increase by projectileSpeed * deltaTimeprojectileSpeed * deltaTime in the update after the function was called:
AS THE PROJECTILE
const float projectileHeight = 10f; const float projectileSpeed = 5f; Vector3 startPos; Vector3 endPos; float fireLerp = 1; void FireProjectile(Vector3 firePoint, Vector3 targetPos) { startPos = firePoint; endPos = targetPos; // Setting the fire lerp to 0 will begin the fire animation fireLerp = 0; } void Update() { if (fireLerp < 1) { Vector3 newProjectilePos = CalculateTrajectory(startPos, endPos, fireLerp); transform.position = newProjectilePos; fireLerp += projectileSpeed * Time.deltaTime; } } Vector3 CalculateTrajectory(Vector3 firePos, Vector3 targetPos, float t) { Vector3 linearProgress = Vector3.Lerp(firePos, targetPos, t); float perspectiveOffset = Mathf.Sin(t * Mathf.PI) * projectileHeight; Vector3 trajectoryPos = linearProgress + (Vector3.up * perspectiveOffset); return trajectoryPos; } 
