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

Unity 2D简易移动系统仅沿X轴移动问题如何解决

问题根因

你遇到的两个异常都是代码逻辑错误+物理配置缺失导致的,具体原因如下:

  • 仅能沿X轴移动:FixedUpdate中处理垂直输入时,错误将垂直方向的作用力赋值给了二维向量的X分量,Y轴分量始终为0,垂直输入不会产生Y轴方向的力;甚至按上下方向键时,角色还会额外受到X轴方向的力,输入逻辑完全错位。
  • 无输入时无法自主减速:
    1. 物理逻辑生命周期错误:Rigidbody2D的力施加属于物理计算逻辑,你将水平方向加力写在帧更新Update中(执行间隔随帧率波动),垂直方向加力写在固定物理步长的FixedUpdate中,会导致受力计算不稳定,且没有在输入为0时编写任何减速逻辑。
    2. 刚体阻力配置缺失:如果Rigidbody2D组件的*Linear Drag(线性阻力)*参数为0,刚体在不受外力时会保持当前运动状态一直匀速移动,不会自然停下。
    3. 原逻辑仅在有输入时施加驱动力,输入归零时没有任何速度衰减处理,自然无法减速。
      额外问题:原代码未声明_rb刚体变量,会直接触发编译报错。
修复方案

按以下步骤调整即可解决所有问题:

  1. 补全刚体变量声明,统一输入读取和物理逻辑的生命周期:所有输入读取放在Update中执行(避免固定步长导致的输入丢失),所有刚体受力、速度修改等物理操作全部移到FixedUpdate中执行。
  2. 修正作用力方向:水平输入对应X轴力,垂直输入对应Y轴力,对输入向量做归一化处理,避免斜向移动时速度比水平/垂直移动快。
  3. 补充减速逻辑:
    • 基础方案:选中挂载脚本的游戏对象,在Rigidbody2D组件面板将Linear Drag调整为3~10区间的数值(数值越大减速越快,可根据手感调整),无驱动力时刚体会受阻力自然减速。
    • 高可控方案:在代码中增加输入为0时的速度插值衰减逻辑,不依赖物理参数,减速手感更稳定。
  4. (可选优化)如果不想要加速过程、想要按键即达到最大移动速度,可以直接修改刚体速度代替AddForce,同时对最大速度做钳制,避免速度无限叠加。
修正后参考代码
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    private Rigidbody2D _rb;
    private float _walkspeed;
    private float _inputHorizontal;
    private float _inputVertical;
    // 减速系数,可在Inspector面板调整手感,值越大停下越快
    public float deceleration = 6f;
    // 最大移动速度,避免AddForce导致速度无限叠加
    public float maxMoveSpeed = 8f;

    void Start()
    {
        _rb = GetComponent<Rigidbody2D>();
        _walkspeed = 5.5f;
    }

    void Update()
    {
        // 仅在Update中读取输入,不做物理操作
        _inputHorizontal = Input.GetAxisRaw("Horizontal");
        _inputVertical = Input.GetAxisRaw("Vertical");
    }

    private void FixedUpdate()
    {
        // 所有物理逻辑统一在FixedUpdate中执行
        Vector2 moveInput = new Vector2(_inputHorizontal, _inputVertical).normalized;
        
        if (moveInput != Vector2.zero)
        {
            _rb.AddForce(moveInput * _walkspeed);
            // 钳制最大速度,避免速度持续叠加
            if (_rb.velocity.magnitude > maxMoveSpeed)
            {
                _rb.velocity = _rb.velocity.normalized * maxMoveSpeed;
            }
        }
        else
        {
            // 无输入时线性插值减速到0
            _rb.velocity = Vector2.Lerp(_rb.velocity, Vector2.zero, deceleration * Time.fixedDeltaTime);
        }
    }
}
额外排查点

如果调整完代码后仍有异常,检查以下配置:

  • 确认Rigidbody2D的Gravity Scale参数为0,避免重力影响导致Y轴持续下坠
  • 确认角色的碰撞体没有和其他静态碰撞体产生异常卡位
  • 确认输入管理器中Horizontal、Vertical轴的正向反向按键绑定正确

内容的提问来源于stack exchange,提问作者ECC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 00:51:23