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

如何实现Unity中玩家通过触摸输入在X轴自由移动?

触摸控制无效的解决方案(类地铁跑酷X轴移动)

问题现状

已实现玩家向前移动,键盘A/D键可控制X轴自由移动(无三线路限制),但尝试5种触摸控制方式均无效,已编写触摸输入判断语句但不知后续逻辑如何对接现有移动代码。现有核心代码如下:

public float speed = 5;
public Rigidbody rb;
public bool CanMove = false;
float horizontalInput;
[SerializeField] float horizontalMultiplier = 2;
Vector3 horizontalMove;
Vector3 RbPositionCheck;

private void Update()
{
    if (Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);
        Vector3 touchPosition = Camera.main.ScreenToViewportPoint(touch.position);
        Mathf.Round(touchPosition.x);
    }
    
    if (CanMove == true)
    {
        #region horizontalInput
        horizontalInput = Input.GetAxis("Horizontal");
        #endregion

        #region Vector3 Calculations
        Vector3 forwardMove = transform.forward * speed * Time.deltaTime;
        horizontalMove = transform.right * horizontalInput * speed * Time.deltaTime * horizontalMultiplier;
        #endregion

        #region RbPositionCheck and Mathf.Clamp
        RbPositionCheck = rb.position;
        RbPositionCheck.x = Mathf.Clamp(RbPositionCheck.x, -4f, 4f);
        #endregion

        #region rb.MovePosition
        rb.MovePosition(RbPositionCheck + forwardMove + horizontalMove);
        #endregion
    }
}

解决方案

核心逻辑是将触摸位置转换为对应水平输入值,直接对接原有移动框架,无需重构核心移动代码:

  • 将触摸坐标转为水平输入:把屏幕视口坐标(0-1范围)转换为-1到1的水平轴输入值,触摸左侧对应左移(-1),右侧对应右移(1)
  • 添加触摸死区:避免触摸屏幕中间区域时误触发移动,提升操作手感
  • 整合触摸与键盘输入:保留键盘输入作为备选,同时让触摸输入优先覆盖键盘输入

修改后的完整代码

public float speed = 5;
public Rigidbody rb;
public bool CanMove = false;
float horizontalInput;
[SerializeField] float horizontalMultiplier = 2;
// 可调整的触摸死区,范围0-0.5,值越大死区越大
[SerializeField] float touchDeadZone = 0.1f;

private void Update()
{
    // 每次帧初始化输入为0,避免触摸结束后残留移动指令
    horizontalInput = 0;

    // 处理触摸输入
    if (Input.touchCount > 0)
    {
        Touch touch = Input.GetTouch(0);
        Vector3 touchViewportPos = Camera.main.ScreenToViewportPoint(touch.position);
        
        // 将视口X坐标(0-1)转换为-1到1的水平输入
        float touchHorizontal = (touchViewportPos.x - 0.5f) * 2;
        
        // 应用死区:只有输入超出死区范围才生效
        if (Mathf.Abs(touchHorizontal) > touchDeadZone)
        {
            horizontalInput = touchHorizontal;
        }
    }

    // 保留键盘输入(可根据需求删除此段)
    if (Input.GetAxis("Horizontal") != 0)
    {
        horizontalInput = Input.GetAxis("Horizontal");
    }
    
    if (CanMove)
    {
        Vector3 forwardMove = transform.forward * speed * Time.deltaTime;
        Vector3 horizontalMove = transform.right * horizontalInput * speed * Time.deltaTime * horizontalMultiplier;

        // 计算目标位置并限制X轴边界
        Vector3 targetPosition = rb.position + forwardMove + horizontalMove;
        targetPosition.x = Mathf.Clamp(targetPosition.x, -4f, 4f);
        
        rb.MovePosition(targetPosition);
    }
}

关键修改说明

  • 新增touchDeadZone参数,可根据手感调整触摸触发的灵敏度
  • 触摸输入直接赋值给horizontalInput,复用原有移动逻辑,无需额外编写移动代码
  • 初始化horizontalInput为0,确保触摸结束后玩家停止X轴移动
  • 优化了位置计算逻辑,合并边界限制与目标位置计算,代码更简洁

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:41:00