J'ai le code suivant pour calculer la traduction requise pour déplacer un objet de jeu dans Unity, qui est appelé LateUpdate
. D'après ce que je comprends, mon utilisation de Time.deltaTime
devrait rendre la fréquence d'images finale de la traduction indépendante (veuillez noter qu'il CollisionDetection.Move()
s'agit simplement de lancer des raycasts).
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 je verrouille la fréquence d'images du jeu à 60 images par seconde, mes objets se déplacent comme prévu. Cependant, si je le déverrouille ( Application.targetFrameRate = -1;
), certains objets se déplaceront à un rythme beaucoup plus lent que ce à quoi je m'attendrais en atteignant ~ 200FPS sur un moniteur 144hz. Cela ne semble se produire que dans une version autonome, et non dans l'éditeur Unity.
GIF de mouvement d'objet dans l'éditeur, FPS déverrouillé
http://gfycat.com/SmugAnnualFugu
GIF de mouvement d'objet dans la version autonome, FPS déverrouillé