TouchManager

这是一个专为"拖拽牌块"设计的触摸输入管理器,负责将用户的滑动操作转换为游戏世界中物体的实时位移,并协调拖拽的开始、进行中和结束后的重置逻辑。它是麻将消消游戏交互层的核心组件之一。

核心功能

  1. 监听全局触摸/鼠标事件

    通过 TouchPad.Instance 的事件(ScreenDragEvent、ScreenPointerDownEvent、ScreenPointerUpEvent)获取屏幕上的按下、移动、抬起操作。

  2. 控制一个可拖拽物体的跟随移动

    • 当手指/鼠标按下并开始拖拽时,记录起始位置和拖拽路径。

    • 如果满足一定路径长度(dragPathLength > 0.1f),则标记 MinDragReached。

    • 如果设置了 FirstObject(即当前被拖拽的牌块),则启动协程 SlowFollowC,将牌块的位置实时更新为"起始位置 + 拖拽偏移量",实现视觉上的跟随拖拽。

  3. 管理拖拽状态

    • CanDrag:是否允许拖拽。

    • MinDragReached:是否达到最小拖拽距离(可用于判断是否为有效拖拽,避免误触)。

    • ResetDragEvent 回调:当拖拽结束或指针离开 UI 区域时,调用外部传入的回放方法,将牌块复位或完成匹配逻辑。

  4. 判断运行平台
    IsMobileDevice() 根据 SystemInfo.deviceType 返回是否为手持设备(手机),可用于区分鼠标输入和触摸输入。

  5. 实现 IPointerExitHandler

    当指针(鼠标/手指)离开当前 UI 元素时,立即取消拖拽并调用重置回调,确保拖拽不会"逃出"有效区域。

在这个项目中扮演的角色

麻将消消类游戏通常需要拖拽牌块到某个目标位置 或滑动选择相邻牌 。TouchManager 充当了拖拽行为的控制中枢:

  • 它与底层的 TouchPad(负责转换屏幕坐标到世界坐标)配合。

  • 它对外暴露 SetFirstObject 方法,允许外部指定当前被拖拽的物体和一个重置回调。

  • 拖拽过程中的实时跟随是"每帧更新位置",注意它用了 WaitForEndOfFrame,意味着跟随发生在渲染之前,看起来会比较平滑。

代码中的一些设计细节

  • 单例 Instance:确保全局只有一个拖拽管理器。

  • 协程 SlowFollowC :每帧只执行一次位置更新,避免每帧都开新协程(通过 followStarted 标志限制)。

  • ResetDragEvent 是一个 Action<Action>,即它接受一个 completeCallBack 参数,允许异步完成重置后执行回调。

  • 拖拽路径长度累积 :每次 LastScreenDragHandler 中累加当前帧与上一帧的移动距离,用于判断是否为"有意拖拽"(避免手抖误触)。

时序图

相关推荐
爱吃奥利奥_wen10 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
Martina_032120 小时前
AI生成3D场景导入 Unity/Unreal 后,NPC 总串层?用6步检查导航高度与跨层连接
人工智能·游戏·数学建模·3d·unity·自然语言处理·aigc
wflynn21 小时前
GitHub 今日推荐|SCSKiller:游戏着色器预编译消除卡顿
开源·c#·github·nvidia·amd·directx12
小贺儿开发1 天前
Unity 局域网遥控幻灯片展示工具 3.0
科技·http·unity·工具·ppt·通信·网页
疯狂的维修2 天前
关于用C#写电机起保停控制
开发语言·c#
用户788477316342 天前
门店核销闭环:小程序扫码 + .NET 幂等接口 + WPF 看板,一天能跑通
微信小程序·c#
samble2 天前
从零搭建灌装监控系统(十三):报警系统设计,生命周期与通知
c#·wpf·mvvm·modbus·工业控制
miofly2 天前
GitHub 今日推荐|SCSKiller:游戏着色器预编译消除卡顿
开源·c#·github
周杰伦fans3 天前
8GB显存下模型量化实战指南
人工智能·后端·c#
samble3 天前
从零搭建灌装监控系统(十二):配置系统,原子写入与容错
c#·wpf·mvvm·modbus·工业控制