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

Unity 2D游戏如何通过C#脚本实现角色X轴左右移动功能

Unity 2D 角色水平移动问题修复方案

你现有代码存在3个核心问题,会导致移动逻辑无法正常运行:

  • 输入逻辑错误:仅监听了右方向键的单次按下事件,既没有处理左方向键输入,也没有在按键抬起时复位标记位,movementRight一旦设为true就会永久生效,角色会不受控一直右移;且GetKeyDown仅在按下瞬间触发一帧,按住按键不会持续移动,不符合常规游戏操作逻辑
  • API调用错误:MovePosition是Rigidbody2D的实例方法,你既没有使用提前获取的rigidbodyComponent实例调用,也没有传入目标位置参数,代码会直接编译报错
  • 冗余/硬编码问题:声明了CharacterController和moveSpeed字段但全程没有使用,且跳跃力度硬编码在逻辑里,后期调参需要反复修改代码重编译,效率极低

修复后的完整代码

using UnityEngine;

public class Movement2d : MonoBehaviour
{
    [Header("运动参数")]
    public float jumpForce = 10f;
    public float moveSpeed = 5f;
    
    private bool jumpKeyWasPressed;
    private float horizontalInput;
    private Rigidbody2D rigidbodyComponent;

    void Start()
    {
        rigidbodyComponent = GetComponent<Rigidbody2D>();
        // 未使用CharacterController组件可以直接删除相关声明,避免空引用报错
    }

    void Update()
    {
        // 检测跳跃输入
        if (Input.GetKeyDown(KeyCode.Space))
        {
            jumpKeyWasPressed = true;
        }

        // 获取水平方向输入,返回值范围-1~1,自动适配方向键左右、A/D键
        horizontalInput = Input.GetAxisRaw("Horizontal");
    }

    private void FixedUpdate()
    {
        // 处理跳跃逻辑
        if (jumpKeyWasPressed)
        {
            rigidbodyComponent.AddForce(new Vector2(0, jumpForce), ForceMode2D.Impulse);
            jumpKeyWasPressed = false;
        }

        // 处理水平移动:保留Y轴原有的重力、跳跃速度,仅修改X轴移动速度
        rigidbodyComponent.velocity = new Vector2(horizontalInput * moveSpeed, rigidbodyComponent.velocity.y);
    }
}

代码说明

  • 严格遵循Unity生命周期规则:所有输入检测放在Update中执行,所有物理逻辑(修改刚体速度、施加冲量)放在FixedUpdate中执行,避免不同帧率下出现移动抖动、输入丢失问题
  • 用Input.GetAxisRaw("Horizontal")统一获取水平输入,不需要单独写左右按键的判断逻辑,返回-1时对应左方向输入,返回1时对应右方向输入,返回0时无水平输入
  • 移动逻辑直接修改刚体velocity属性,不会抵消跳跃、重力带来的Y轴速度,和你原有跳跃逻辑的兼容性更好,不会出现移动打断跳跃的问题
  • 跳跃力度、移动速度都设为可在Inspector面板直接调整的公共字段,调参时不需要修改代码重编译

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 14:09:18