Tengo el siguiente código para calcular la traducción requerida para mover un objeto de juego en Unity, que se llama LateUpdate
. Por lo que entiendo, mi uso de Time.deltaTime
debería hacer que la velocidad de fotogramas de traducción final sea independiente (tenga en cuenta CollisionDetection.Move()
que solo está realizando transmisiones de rayos).
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);
}
Si bloqueo el framerate del juego a 60FPS, mis objetos se mueven como se esperaba. Sin embargo, si lo desbloqueo ( Application.targetFrameRate = -1;
), algunos objetos se moverán a una velocidad mucho más lenta de lo que esperaría cuando logre ~ 200FPS en un monitor de 144hz. Esto solo parece suceder en una compilación independiente, y no dentro del editor de Unity.
GIF de movimiento de objetos dentro del editor, FPS desbloqueado
http://gfycat.com/SmugAnnualFugu
GIF de movimiento de objetos dentro de la construcción independiente, FPS desbloqueado