如何使用Unity新输入系统实现滑动操作控制相机移动
Unity 新版输入系统捕获滑动起止位置实现方案
你之前的事件绑定思路方向正确,核心问题是不能把事件注册逻辑写在Update()方法中,每帧执行会重复注册回调导致逻辑异常,只需要在初始化阶段注册一次事件,用类成员变量缓存起止位置,就可以在Update流程中对接你已经写完的相机移动逻辑。
前置输入配置确认
先确认你的Input Action资产配置符合要求:
PrimaryContact:绑定为Button类型,映射路径选<Pointer>/press(适配鼠标+触摸)或<Touchscreen>/primaryTouch/touch(仅适配触摸),用于监听触摸按下/抬起状态PrimaryPosition:绑定为Value类型(值类型选Vector2),映射路径选<Pointer>/position或<Touchscreen>/primaryTouch/position,用于读取触点屏幕坐标,你之前写的PrimaryPosition()读取方法可以正常使用。
完整实现代码
using UnityEngine; using UnityEngine.InputSystem; public class SwipeCameraControl : MonoBehaviour { // 输入资产实例 private ScreenControls screenControls; // 缓存滑动起始、结束屏幕坐标 private Vector2 _swipeStart; private Vector2 _swipeEnd; // 标记一次完整滑动是否完成 private bool _swipeReadyToProcess = false; private void Awake() { screenControls = new ScreenControls(); } private void OnEnable() { screenControls.SwipeMap.Enable(); // 仅在启用时注册一次事件,禁止放到Update中 screenControls.SwipeMap.PrimaryContact.started += HandleTouchStart; screenControls.SwipeMap.PrimaryContact.canceled += HandleTouchEnd; } private void OnDisable() { // 禁用时注销事件,避免内存泄漏 screenControls.SwipeMap.PrimaryContact.started -= HandleTouchStart; screenControls.SwipeMap.PrimaryContact.canceled -= HandleTouchEnd; screenControls.SwipeMap.Disable(); } private void HandleTouchStart(InputAction.CallbackContext context) { // 触摸按下瞬间记录起始坐标 _swipeStart = screenControls.SwipeMap.PrimaryPosition.ReadValue<Vector2>(); _swipeReadyToProcess = false; } private void HandleTouchEnd(InputAction.CallbackContext context) { // 触摸抬起瞬间记录结束坐标,标记滑动待处理 _swipeEnd = screenControls.SwipeMap.PrimaryPosition.ReadValue<Vector2>(); _swipeReadyToProcess = true; } private void Update() { // 检测到有效滑动完成时,调用相机移动逻辑 if (_swipeReadyToProcess) { MoveCameraOnSwipe(_swipeStart, _swipeEnd); _swipeReadyToProcess = false; } } // 你已经实现的相机移动逻辑,补充参数接收起止坐标即可 private void MoveCameraOnSwipe(Vector2 startPos, Vector2 endPos) { // 原有计算滑动距离、方向、驱动相机位移的逻辑 } }
可选扩展与注意事项
- 如果需要实现拖动实时跟随效果(不是等手指抬起才移动相机),可以新增
PrimaryContact.performed事件回调,在触摸持续阶段每帧读取PrimaryPosition值,实时计算位移驱动相机即可 - 新输入系统返回的屏幕坐标原点为屏幕左下角,如果要和UGUI坐标做转换,需要注意Y轴方向差
- 可以加最小滑动距离判断,过滤误触:比如判断
Vector2.Distance(_swipeStart, _swipeEnd)大于设定阈值(比如20像素)时才触发相机移动
内容的提问来源于stack exchange,提问作者cinnamonrollapplecider
相关产品推荐
相关产品推荐

