You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:45:00