Tôi có đoạn mã sau để tính toán bản dịch cần thiết để di chuyển một đối tượng trò chơi trong Unity, được gọi là LateUpdate
. Theo những gì tôi hiểu, việc sử dụng của tôi Time.deltaTime
sẽ làm cho tốc độ khung hình dịch cuối cùng trở nên độc lập (xin lưu ý CollisionDetection.Move()
là chỉ thực hiện các chương trình phát sóng).
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);
}
Nếu tôi khóa tốc độ khung hình của trò chơi lên 60FPS, các đối tượng của tôi sẽ di chuyển như mong đợi. Tuy nhiên, nếu tôi mở khóa nó ( Application.targetFrameRate = -1;
), một số đối tượng sẽ di chuyển với tốc độ chậm hơn nhiều thì tôi sẽ mong đợi khi đạt được ~ 200FPS trên màn hình 144hz. Điều này dường như chỉ xảy ra trong một bản dựng độc lập, và không nằm trong trình chỉnh sửa Unity.
GIF chuyển động của đối tượng trong trình chỉnh sửa, FPS đã được mở khóa
http://gfycat.com/SmugAnnualFugu
GIF chuyển động của đối tượng trong bản dựng độc lập, FPS đã được mở khóa