Unity中停止速度的代码为何失效?添加else if后角色无法移动
问题分析与修复
核心问题1:时间步参数错误
你在Update方法里误用了Time.fixedDeltaTime,这个参数是给**FixedUpdate(物理更新帧)**使用的,Update的时间步应该用Time.deltaTime。用错参数会导致移动速度被大幅缩小,看起来像完全没动。
核心问题2:逻辑分支设计不合理
Input.GetKeyUp(KeyCode.D)只会在松开D键的那一帧触发,用else if和Input.GetKey绑定后,无法覆盖“既没按住也没松开D键”的常规状态。要实现“松开后停止滑动”的需求,直接用else分支处理所有“未按住D键”的情况更稳妥,每帧都会检查,避免遗漏。
修正后的代码
void Update() { if (Input.GetKey(KeyCode.D)) { // Update用Time.deltaTime,确保移动速度和帧率无关 rigidbody.velocity = new Vector2(speed * Time.deltaTime, rigidbody.velocity.y); } else { // 未按住D键时,重置水平速度防止滑动 rigidbody.velocity = new Vector2(0, rigidbody.velocity.y); } }
额外优化建议
- 变量名
Rigidbody应小写开头(rigidbody),符合C#命名规范;新版本Unity建议提前获取刚体组件引用(你用Vector2应该是2D刚体):private Rigidbody2D rb; void Start() { rb = GetComponent<Rigidbody2D>(); } void Update() { if (Input.GetKey(KeyCode.D)) { rb.velocity = new Vector2(speed * Time.deltaTime, rb.velocity.y); } else { rb.velocity = new Vector2(0, rb.velocity.y); } } - 如果是3D项目,把
Rigidbody2D换成Rigidbody,Vector2换成Vector3即可。
内容的提问来源于stack exchange,提问作者Euler
相关产品推荐
相关产品推荐

