Unity 2D如何让物体恒定速度朝面向移动,水平输入仅转向不改速度
你现有代码的核心问题:将移动方向和输入直接绑定了,没有输入时movementDirection为零,自然就不会移动。且你挂载了Rigidbody2D却使用transform.Translate控制移动,会和物理引擎计算冲突,容易出现碰撞异常、卡顿等问题。
实现逻辑
你需要单独维护一个全局的移动方向变量,输入仅用来修改这个变量的朝向,移动逻辑全程以该变量为基准,和输入解绑,即可实现全程恒速移动、仅按A/D调整方向的效果。
完整修改后代码
using UnityEngine; public class ConstantMovement : MonoBehaviour { [SerializeField] private float speed; [SerializeField] private float rotationSpeed; private Rigidbody2D _rb; // 存储当前的移动方向,全程和输入解绑 private Vector2 _currentMoveDir; void Start() { _rb = GetComponent<Rigidbody2D>(); // 初始化移动方向为物体默认的朝上方向,可根据需求改成transform.right等 _currentMoveDir = transform.up; } void Update() { // 仅读取水平输入控制转向 float horizontalInput = Input.GetAxis("Horizontal"); if (Mathf.Abs(horizontalInput) > 0.01f) { // 计算需要旋转的角度:按住A/D时按rotationSpeed的速率转向 float rotateAngle = -horizontalInput * rotationSpeed * Time.deltaTime; // 给当前移动方向叠加旋转 _currentMoveDir = Quaternion.Euler(0, 0, rotateAngle) * _currentMoveDir; // 同步物体朝向和移动方向 Quaternion targetRot = Quaternion.LookRotation(Vector3.forward, _currentMoveDir); transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRot, Mathf.Abs(rotateAngle)); } } void FixedUpdate() { // 物理更新里恒定设置速度,和输入无关 _rb.velocity = _currentMoveDir * speed; } }
注意事项
- 请在Inspector面板中将挂载的Rigidbody2D组件的
Gravity Scale属性设置为0,避免物体受重力影响偏移。 - 如果你需要初始移动方向为朝右,将Start里的
_currentMoveDir = transform.up改成_currentMoveDir = transform.right即可。 - 调整
rotationSpeed的数值可以修改按住A/D时的转向快慢。
内容的提问来源于stack exchange,提问作者Evgeniy Mokrushin
相关产品推荐
相关产品推荐

