Ho il seguente codice per calcolare la traduzione richiesta per spostare un oggetto di gioco in Unity, che viene chiamato LateUpdate. Da quanto ho capito, il mio uso di Time.deltaTimedovrebbe rendere indipendente la frequenza di fotogrammi della traduzione finale (si prega di notare che CollisionDetection.Move()sta solo eseguendo i raycast).
public IMovementModel Move(IMovementModel model) {
this.model = model;
targetSpeed = (model.HorizontalInput + model.VerticalInput) * model.Speed;
model.CurrentSpeed = accelerateSpeed(model.CurrentSpeed, targetSpeed,
model.Accel);
if (model.IsJumping) {
model.AmountToMove = new Vector3(model.AmountToMove.x,
model.AmountToMove.y);
} else if (CollisionDetection.OnGround) {
model.AmountToMove = new Vector3(model.AmountToMove.x, 0);
}
model.FlipAnim = flipAnimation(targetSpeed);
// If we're ignoring gravity, then just use the vertical input.
// if it's 0, then we'll just float.
gravity = model.IgnoreGravity ? model.VerticalInput : 40f;
model.AmountToMove = new Vector3(model.CurrentSpeed, model.AmountToMove.y - gravity * Time.deltaTime);
model.FinalTransform =
CollisionDetection.Move(model.AmountToMove * Time.deltaTime,
model.BoxCollider.gameObject, model.IgnorePlayerLayer);
// Prevent the entity from moving too fast on the y-axis.
model.FinalTransform = new Vector3(model.FinalTransform.x,
Mathf.Clamp(model.FinalTransform.y, -1.0f, 1.0f),
model.FinalTransform.z);
return model;
}
private float accelerateSpeed(float currSpeed, float target, float accel) {
if (currSpeed == target) {
return currSpeed;
}
// Must currSpeed be increased or decreased to get closer to target
float dir = Mathf.Sign(target - currSpeed);
currSpeed += accel * Time.deltaTime * dir;
// If currSpeed has now passed Target then return Target, otherwise return currSpeed
return (dir == Mathf.Sign(target - currSpeed)) ? currSpeed : target;
}
private void OnMovementCalculated(IMovementModel model) {
transform.Translate(model.FinalTransform);
}
Se blocco il framerate del gioco a 60FPS, i miei oggetti si muovono come previsto. Tuttavia, se lo sblocco ( Application.targetFrameRate = -1;), alcuni oggetti si sposteranno a un ritmo molto più lento di quanto mi aspetterei quando si raggiungono ~ 200FPS su un monitor da 144Hz. Questo sembra accadere solo in una build autonoma e non all'interno dell'editor Unity.
GIF del movimento degli oggetti all'interno dell'editor, FPS sbloccato
http://gfycat.com/SmugAnnualFugu
GIF di movimento degli oggetti all'interno della build autonoma, FPS sbloccato


