如何实现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
相关产品推荐
相关产品推荐

