ฉันมีรหัสต่อไปนี้เพื่อคำนวณการแปลที่จำเป็นในการย้ายวัตถุเกมใน Unity ซึ่งเรียกว่าLateUpdate
มา จากสิ่งที่ฉันเข้าใจการใช้งานของฉันTime.deltaTime
ควรจะทำให้เป็นอิสระแปลสุดท้ายอัตราเฟรม (โปรดทราบCollisionDetection.Move()
เป็นเพียงการแสดง 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);
}
ถ้าฉันล็อคอัตราเฟรมของเกมเป็น 60FPS วัตถุของฉันจะเคลื่อนไหวตามที่คาดไว้ อย่างไรก็ตามถ้าฉันปลดล็อคมัน ( Application.targetFrameRate = -1;
) วัตถุบางอย่างจะเคลื่อนที่ในอัตราที่ช้ากว่ามากฉันคาดหวังว่าเมื่อบรรลุ ~ 200FPS บนหน้าจอขนาด 144hz สิ่งนี้ดูเหมือนว่าจะเกิดขึ้นในบิลด์สแตนด์อโลนเท่านั้นและไม่อยู่ในตัวแก้ไข Unity
GIF ของการเคลื่อนย้ายวัตถุภายในตัวแก้ไขปลดล็อก FPS
http://gfycat.com/SmugAnnualFugu
GIF ของการเคลื่อนย้ายวัตถุภายในบิลด์แบบสแตนด์อโลนปลดล็อค FPS