这是一个专为"拖拽牌块"设计的触摸输入管理器,负责将用户的滑动操作转换为游戏世界中物体的实时位移,并协调拖拽的开始、进行中和结束后的重置逻辑。它是麻将消消游戏交互层的核心组件之一。
核心功能
-
监听全局触摸/鼠标事件
通过
TouchPad.Instance的事件(ScreenDragEvent、ScreenPointerDownEvent、ScreenPointerUpEvent)获取屏幕上的按下、移动、抬起操作。 -
控制一个可拖拽物体的跟随移动
-
当手指/鼠标按下并开始拖拽时,记录起始位置和拖拽路径。
-
如果满足一定路径长度(
dragPathLength > 0.1f),则标记MinDragReached。 -
如果设置了
FirstObject(即当前被拖拽的牌块),则启动协程SlowFollowC,将牌块的位置实时更新为"起始位置 + 拖拽偏移量",实现视觉上的跟随拖拽。
-
-
管理拖拽状态
-
CanDrag:是否允许拖拽。 -
MinDragReached:是否达到最小拖拽距离(可用于判断是否为有效拖拽,避免误触)。 -
ResetDragEvent回调:当拖拽结束或指针离开 UI 区域时,调用外部传入的回放方法,将牌块复位或完成匹配逻辑。
-
-
判断运行平台
IsMobileDevice()根据SystemInfo.deviceType返回是否为手持设备(手机),可用于区分鼠标输入和触摸输入。 -
实现
IPointerExitHandler当指针(鼠标/手指)离开当前 UI 元素时,立即取消拖拽并调用重置回调,确保拖拽不会"逃出"有效区域。
在这个项目中扮演的角色
麻将消消类游戏通常需要拖拽牌块到某个目标位置 或滑动选择相邻牌 。TouchManager 充当了拖拽行为的控制中枢:
-
它与底层的
TouchPad(负责转换屏幕坐标到世界坐标)配合。 -
它对外暴露
SetFirstObject方法,允许外部指定当前被拖拽的物体和一个重置回调。 -
拖拽过程中的实时跟随是"每帧更新位置",注意它用了
WaitForEndOfFrame,意味着跟随发生在渲染之前,看起来会比较平滑。
代码中的一些设计细节
-
单例
Instance:确保全局只有一个拖拽管理器。 -
协程
SlowFollowC:每帧只执行一次位置更新,避免每帧都开新协程(通过followStarted标志限制)。 -
ResetDragEvent是一个Action<Action>,即它接受一个completeCallBack参数,允许异步完成重置后执行回调。 -
拖拽路径长度累积 :每次
LastScreenDragHandler中累加当前帧与上一帧的移动距离,用于判断是否为"有意拖拽"(避免手抖误触)。
时序图
