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
相关产品推荐
相关产品推荐

