Unity中是否应为PlayerMovement代码添加Time.deltaTime?如何正确实现?
关于PlayerMovement中Time.deltaTime的正确用法
你现在的问题核心是错误地在直接设置Rigidbody2D.velocity时乘以了Time.deltaTime。Velocity本身代表的是「每秒移动的距离」,而你把它乘以每帧的时间(Time.deltaTime通常在0.016左右,对应60帧),相当于把速度缩小到了原来的1/60,角色自然移动极慢。
什么时候该用Time.deltaTime?
只有当你逐帧累加位移的时候才需要用它,比如用Transform.Translate()这类每帧调用的移动方法——因为不同设备帧率不同,乘以Time.deltaTime能保证不管帧率高低,每秒移动的距离一致。但Rigidbody的velocity是直接设置「每秒速度」,不需要额外乘Time.deltaTime。
修正后的代码
using UnityEngine; using UnityEngine.SceneManagement; public class PlayerMovement : MonoBehaviour { [SerializeField] private float horSpeed; [SerializeField] private float vertSpeed; private Rigidbody2D rb; private bool isJumping; private void Start() { rb = GetComponent<Rigidbody2D>(); } private void Update() { var v = rb.velocity; // 跳跃:直接设置垂直速度,无需乘Time.deltaTime if (Input.GetKey(KeyCode.Space) && !isJumping) { v.y = vertSpeed; isJumping = true; } // 左右移动:用else if避免按键冲突,松开时重置水平速度 if (Input.GetKey(KeyCode.A)) v.x = -horSpeed; else if (Input.GetKey(KeyCode.D)) v.x = horSpeed; else v.x = 0; // 向下移动:直接设置垂直速度 if (Input.GetKey(KeyCode.S)) v.y = -vertSpeed; rb.velocity = v; if(Input.GetKey(KeyCode.Escape)) SceneManager.LoadScene(0); } private void OnCollisionEnter2D(Collision2D collision) { // 建议这里加地面标签判断,避免碰撞到其他物体也触发跳跃重置 // if (collision.gameObject.CompareTag("Ground")) isJumping = false; } }
额外优化建议
- 左右移动用
else if可以避免同时按A和D时的逻辑冲突,松开按键时把x速度设为0,能让角色停止移动更及时(如果你想要滑动效果,可以保留原来的写法,或者用摩擦力来实现)。 - 跳跃的地面检测可以优化:给地面物体添加
Ground标签,然后在OnCollisionEnter2D里判断标签,这样只有碰到地面才允许再次跳跃,避免碰到敌人或其他物体就触发跳跃重置。
内容的提问来源于stack exchange,提问作者Dom Sendall
相关产品推荐
相关产品推荐

