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

新输入系统下摇杆与屏幕滑动冲突及触控区域限制咨询

解决新输入系统中摇杆与屏幕滑动的触控冲突问题

针对你遇到的摇杆操作时触发屏幕滑动相机旋转的问题,以下是几种直接可行的解决方案:

方法1:通过触控点区域判断过滤

核心思路是获取摇杆在屏幕上的矩形范围,处理滑动输入时先检查触摸点是否在该范围外,再执行相机旋转逻辑:

  1. 先通过UGUI的RectTransform获取摇杆的屏幕区域:
using UnityEngine;
using UnityEngine.UI;

public class CameraRotation : MonoBehaviour
{
    public RectTransform joystickRT;
    private Rect joystickScreenRect;
    public float rotationSpeed = 0.1f;

    void Start()
    {
        // 转换摇杆的RectTransform到屏幕像素坐标
        joystickScreenRect = RectTransformUtility.PixelAdjustRect(joystickRT, Canvas.current);
    }

    void Update()
    {
        // 遍历所有触摸点
        foreach (var touch in Touchscreen.current.touches)
        {
            if (touch.phase == TouchPhase.Moved)
            {
                Vector2 touchPos = touch.position.ReadValue();
                // 仅当触摸点不在摇杆区域内时,执行相机旋转
                if (!joystickScreenRect.Contains(touchPos))
                {
                    Vector2 delta = touch.delta.ReadValue();
                    Camera.main.transform.Rotate(Vector3.up, delta.x * rotationSpeed);
                    Camera.main.transform.Rotate(Vector3.right, -delta.y * rotationSpeed);
                }
            }
        }
    }
}

方法2:通过摇杆按压状态控制滑动逻辑

给摇杆添加触摸事件监听,设置标志位控制滑动功能的启用:

  1. 给摇杆的UI按钮/图像添加EventTrigger组件,绑定PointerDown和PointerUp事件:
public class JoystickController : MonoBehaviour
{
    public static bool isJoystickActive = false;

    public void OnJoystickPressed()
    {
        isJoystickActive = true;
    }

    public void OnJoystickReleased()
    {
        isJoystickActive = false;
    }
}
  1. 在相机旋转逻辑中加入状态判断:
void Update()
{
    if (JoystickController.isJoystickActive) return;

    var primaryTouch = Touchscreen.current.primaryTouch;
    if (primaryTouch.phase == TouchPhase.Moved)
    {
        Vector2 delta = primaryTouch.delta.ReadValue();
        Camera.main.transform.Rotate(Vector3.up, delta.x * rotationSpeed);
    }
}

方法3:输入系统动作回调中直接过滤

如果使用输入系统的InputAction绑定滑动动作,可以在回调里直接判断触摸点区域:

using UnityEngine.InputSystem;

public class CameraInputHandler : MonoBehaviour
{
    public InputAction swipeAction;
    public RectTransform joystickRT;
    public float rotationSpeed = 0.1f;

    void Awake()
    {
        swipeAction.performed += ctx =>
        {
            Vector2 touchPos = ctx.ReadValue<Vector2>();
            Rect joystickRect = RectTransformUtility.PixelAdjustRect(joystickRT, Canvas.current);
            
            // 过滤摇杆区域内的触摸
            if (!joystickRect.Contains(touchPos))
            {
                Vector2 delta = ctx.ReadValue<Vector2>();
                Camera.main.transform.Rotate(Vector3.up, delta.x * rotationSpeed);
            }
        };
    }

    void OnEnable() => swipeAction.Enable();
    void OnDisable() => swipeAction.Disable();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 06:05:21