Unity 2D射击游戏角色WASD移动松开按键不停止问题
2D角色移动按键松开后无法停止的问题修复
原代码存在的问题
- 每次按下单个按键时直接覆盖
rigidBody.velocity,多方向按键时逻辑冲突,且松开按键后未重置对应方向速度,导致角色持续移动 - S键的速度计算额外乘以
Time.deltaTime,与其他方向速度倍率不一致,造成移动速度不均 - 未对多方向输入的向量做归一化处理,斜向移动时速度会快于单方向
修改后的实现思路
- 初始化一个空的移动方向向量,根据WASD输入分别修改x、y轴分量
- 对移动方向向量归一化,保证斜向移动速度与单方向一致
- 将最终方向乘以速度和
Time.deltaTime(消除帧率对移动速度的影响),赋值给刚体速度 - 松开所有按键时,移动方向向量归零,刚体速度也随之归零,角色停止移动
修改后的完整代码
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Movement : MonoBehaviour { public Rigidbody2D rigidBody; public float speed = 5f; // 建议用float类型,调整速度更灵活 void Update() { // 初始化移动方向为零向量 Vector2 moveDir = Vector2.zero; // 根据按键输入修改移动方向 if (Input.GetKey("w")) { moveDir.y += 1; } if (Input.GetKey("s")) { moveDir.y -= 1; } if (Input.GetKey("a")) { moveDir.x -= 1; } if (Input.GetKey("d")) { moveDir.x += 1; } // 归一化向量,避免斜向移动速度过快 if (moveDir.magnitude > 1) { moveDir = moveDir.normalized; } // 应用速度,乘以Time.deltaTime让移动帧率无关 rigidBody.velocity = moveDir * speed * Time.deltaTime; } }
额外提示
- 建议使用Unity的**输入管理器(Input Manager)**定义虚拟轴(比如Horizontal和Vertical),可以直接用
Input.GetAxis("Horizontal")和Input.GetAxis("Vertical")获取方向,代码更简洁且支持手柄输入 - 若希望角色有平滑的加速减速效果,可以改用
rigidBody.AddForce代替直接设置velocity,配合摩擦力参数调整手感
内容的提问来源于stack exchange,提问作者Maxim Titovitch
相关产品推荐
相关产品推荐

