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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:42:14