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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:39:00