Skip to main content
added markdown to code in text
Source Link
Pikalek
  • 13.4k
  • 5
  • 49
  • 54

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; } 

enter image description here

enter image description here

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) t would increase by projectileSpeed * 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; } 

enter image description here

enter image description here

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) t would increase by projectileSpeed * 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; } 

enter image description here

enter image description here

Source Link

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) t would increase by projectileSpeed * 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; } 

enter image description here

enter image description here