新输入系统下摇杆与屏幕滑动冲突及触控区域限制咨询
解决新输入系统中摇杆与屏幕滑动的触控冲突问题
针对你遇到的摇杆操作时触发屏幕滑动相机旋转的问题,以下是几种直接可行的解决方案:
方法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:通过摇杆按压状态控制滑动逻辑
给摇杆添加触摸事件监听,设置标志位控制滑动功能的启用:
- 给摇杆的UI按钮/图像添加
EventTrigger组件,绑定PointerDown和PointerUp事件:
public class JoystickController : MonoBehaviour { public static bool isJoystickActive = false; public void OnJoystickPressed() { isJoystickActive = true; } public void OnJoystickReleased() { isJoystickActive = false; } }
- 在相机旋转逻辑中加入状态判断:
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
相关产品推荐
相关产品推荐

