Unity中松开WASD按键后3D角色仍持续移动的问题求助
解决Unity第三人称角色松开按键后滑行的问题
问题根源在于你使用的Input.GetAxis("Horizontal")和Input.GetAxis("Vertical")会对输入做内置平滑处理——松开按键后,返回值不会立刻降到0,而是逐渐衰减,这就导致角色会继续滑动一小段时间。
最快解决方法:使用Input.GetAxisRaw替代Input.GetAxis
Input.GetAxisRaw会直接返回输入的原始值(-1、0、1),没有平滑过渡,松开按键后立刻归零,完美解决滑行问题。
修改你的PlayerController.cs中获取输入的部分:
// 把原来的Input.GetAxis改成Input.GetAxisRaw float horizontal = Input.GetAxisRaw("Horizontal"); float vartical = Input.GetAxisRaw("Vertical");
修改后的完整PlayerController.cs:
public class PlayerController : MonoBehaviour { [SerializeField] float moveSpeed = 5f; [SerializeField] float rotationSpeed = 1000f; Quaternion targetRotation; CameraController cameraController; private void Awake() { cameraController = Camera.main.GetComponent<CameraController>(); } private void Update() { // 关键修改:用GetAxisRaw替代GetAxis float horizontal = Input.GetAxisRaw("Horizontal"); float vartical = Input.GetAxisRaw("Vertical"); float moveAmount = Mathf.Clamp01(Mathf.Abs(horizontal) + Mathf.Abs(vartical)); var moveInput = new Vector3(horizontal, 0, vartical); // 因为GetAxisRaw的斜向输入长度为√2,需要归一化避免移动速度过快 if (moveInput.magnitude > 1) moveInput = moveInput.normalized; var moveDirection = cameraController.PlanerRotation * moveInput; if (moveAmount > 0) { transform.position += moveSpeed * Time.deltaTime * moveDirection; targetRotation = Quaternion.LookRotation(moveDirection); } transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime); } }
额外说明
如果之后你希望保留一点输入平滑但不想有明显滑行,可以手动控制输入衰减速度,比如用Mathf.MoveTowards让输入值快速趋近于0,但对于当前需求来说,GetAxisRaw是最简单直接的方案。
内容的提问来源于stack exchange,提问作者roee
相关产品推荐
相关产品推荐

