如何通过Horizontal和Vertical轴输入控制2D Sprite按固定整数距离移动
实现逻辑说明
你原有代码存在三个核心问题:
- 所用的
Input.GetAxis会返回-1到1之间的平滑过渡浮点值,不是你需要的整数-1/0/1,不符合无小数位移的要求 - 只有乘法运算没有给transform赋值,移动逻辑不会生效
- 你需要的是单次按键固定位移1单位,不需要乘
Time.deltaTime,这个参数是用来做每帧持续移动的速度归一化的,单次触发移动场景不需要使用
你可以用Input.GetAxisRaw来获取-1/0/1的整数输入,配合按键触发逻辑实现需求,以下是两种常用实现方案:
方案1:按一次方向键走1单位,按住不会连续移动
public Rigidbody2D rb2d; void Update() { // 检测水平方向单次按键 if (Input.GetButtonDown("Horizontal")) { // GetAxisRaw直接返回-1/0/1的值,强转int即可获得整数输入 int horizontalInput = (int)Input.GetAxisRaw("Horizontal"); // Unity不允许直接修改position的x/y分量,需要整体赋值新的坐标 rb2d.transform.position = new Vector3( rb2d.transform.position.x + horizontalInput, rb2d.transform.position.y, rb2d.transform.position.z ); } // 检测垂直方向单次按键 if (Input.GetButtonDown("Vertical")) { int verticalInput = (int)Input.GetAxisRaw("Vertical"); rb2d.transform.position = new Vector3( rb2d.transform.position.x, rb2d.transform.position.y + verticalInput, rb2d.transform.position.z ); } }
方案2:按住方向键可连续移动,每次步长固定为1单位
public Rigidbody2D rb2d; // 移动间隔,单位秒,用来控制连续移动的频率 public float moveInterval = 0.2f; private float _moveTimer; void Update() { _moveTimer += Time.deltaTime; if (_moveTimer >= moveInterval) { int horizontalInput = (int)Input.GetAxisRaw("Horizontal"); int verticalInput = (int)Input.GetAxisRaw("Vertical"); // 可选:禁用斜向移动,避免单次位移总长度超过1单位 if (horizontalInput != 0 && verticalInput != 0) { verticalInput = 0; } if (horizontalInput != 0 || verticalInput != 0) { rb2d.transform.position += new Vector3(horizontalInput, verticalInput, 0); _moveTimer = 0; } } }
补充注意点
- 初始化角色时建议把起始坐标设为整数,避免初始就存在浮点偏移
- 如果需要做碰撞判断,可以在位移前加射线检测,判断目标位置是否有碰撞体,避免穿模
- 你也可以直接修改
rb2d.position属性,和修改transform.position效果一致,都是直接瞬移到目标坐标
内容的提问来源于stack exchange,提问作者Daniel Canaria
相关产品推荐
相关产品推荐

