I noticed that my projectiles are overshooting the target, eg they “come out the other side”. After investigating, I found that the actual positions of the projectile and impact point are correct - it’s just the visualization of the projectile (a sphere) that seems ahead of the logical position by one or two steps.
See this image, yellow is the projectile, cubes are tracers I spawn every update, taken in the editor with playmode paused:
Assuming that pausing does not occur in-between rendering, this image indicates that the projectile position is visually not one but two steps ahead of its logical update - or maybe one if we assume that the cube in that gap has been instantiated but will not be rendered until the next frame. But definitely ahead.
The effect is quite noticable in the video, notice how the yellow projectile pops up to the left of the target but the tracers all stack up to the right as it should be:
The projectile is a simple sphere, no collider, and no Rigidbody:
The projectile is moved manually in FixedUpdate (I also tried Update and LateUpdate):
private void FixedUpdate()
{
var currentTime = Time.time;
var deltaTime = Time.deltaTime;
RaycastHit hit = default;
var projectiles = m_Spawner.Projectiles;
var projectileCount = projectiles.Count;
for (var i = projectileCount - 1; i >= 0; i--)
{
var projectile = projectiles[i];
var projectileTransform = projectile.Transform;
var runtimeData = projectile.RuntimeData;
var isEndOfLife = currentTime >= runtimeData.TimeToDie;
if (isEndOfLife)
m_Spawner.DespawnProjectile(i);
else
{
var forward = projectileTransform.forward;
var lastPosition = projectileTransform.position;
var distanceTravelled = projectile.Data.Speed * deltaTime;
var travelRay = new Ray(lastPosition, forward);
var layerMask = projectile.Data.CollidesWithLayers;
var triggerInteraction = projectile.Data.TriggerInteraction;
if (PhysicsExt.ClosestHit(travelRay, out hit, distanceTravelled, layerMask, triggerInteraction))
{
// use less than full distance to keep impact fx a little off-surface (prevent z-fighting)
var hitPosition = lastPosition + forward * (hit.distance * 0.99f);
projectileTransform.position = hitPosition;
m_Spawner.DespawnProjectile(i);
m_Spawner.SpawnEffect(projectile.Data.ImpactPrefab, hitPosition, Quaternion.LookRotation(hit.normal));
SpawnTracer(hitPosition, projectileTransform.rotation, 2f);
}
else
{
var newPosition = lastPosition + forward * distanceTravelled;
projectileTransform.position = newPosition;
SpawnTracer(newPosition, projectileTransform.rotation);
}
}
}
}
For good measure I even instantiated a tracer cube every Update() too.
I also tried disabling post-processing and a low-end quality setting to see if some clever rendering feature might try to smooth out fast-moving things. I also tried limiting the framerate to 30 and vsync on/off.
Note: yes, this is a networked sample but a) the projectiles aren’t network synchronized and b) the effect is clearly visible locally.
What could be causing such a behaviour?

