TouchPad是一个底层触摸输入管理器直接挂载在场景中的 UI 或游戏物体上通过实现 Unity 事件系统接口IPointerDownHandler,IDragHandler,IPointerUpHandler,IBeginDragHandler,IDropHandler,IPointerExitHandler来接收原始指针事件并将其转换为C# 事件供外部订阅如ScreenDragEventExecuteEvents消息发送给碰撞体上的TouchPadMessageTarget组件代码解释1.变量声明接口名称作用回调方法触发时机IPointerDownHandler指针按下void OnPointerDown(PointerEventData eventData)鼠标/手指在物体上按下时IBeginDragHandler开始拖拽void OnBeginDrag(PointerEventData eventData)按下后移动超过阈值开始拖拽时仅触发一次IDragHandler拖拽中void OnDrag(PointerEventData eventData)拖拽过程中每帧触发IPointerUpHandler指针抬起void OnPointerUp(PointerEventData eventData)鼠标/手指抬起时IDropHandler放下void OnDrop(PointerEventData eventData)拖拽的物体被放到另一个可放置的物体上时IPointerExitHandler指针退出void OnPointerExit(PointerEventData eventData)指针移出物体的碰撞区域时2.变量声明2.1 事件声明Action不是 Unity 专属它是C# 内置的委托类型在 Unity 中用来做事件通知、方法回调、解耦代码最常用按钮点击、技能释放、UI 刷新、消息广播。Action- C# 内置的委托类型https://blog.csdn.net/LFJINNAN/article/details/160478366Action 可以存方法的变量只能存 void 方法可以被外部订阅的委托字段作用让外部脚本如TouchManager订阅并接收触摸事件而不需要通过ExecuteEvents机制。TouchPadEventArgshttps://blog.csdn.net/LFJINNAN/article/details/160482722?spm1001.2014.3001.55022.2 属性声明属性类型说明ScreenTouchPosVector2当前触摸点的屏幕坐标私有 setScreenDragDirectionVector2计算当前拖拽方向当前位置 - 上一帧位置WorldTouchPosVector3屏幕坐标转世界坐标依赖Camera.main若相机不存在则返回Vector3.zeroIsTouchedbool是否正在触摸中按下后未抬起/退出IsActivebool触摸处理是否启用可通过SetTouchActivity修改CameraMainCamera简写属性返回Camera.main每次调用都重新获取注意性能注意ScreenTouchPos和IsTouched只有set没有get 实际上代码中是public Vector2 ScreenTouchPos { get; private set; }所以外部可读但不可写。Camera.main每次访问都会调用FindGameObjectsWithTag有一定开销但在触摸事件中调用频率较高每帧可能多次。可以考虑缓存。2.3 序列化字段Inspector 可见dlog编辑器调试日志开关在UNITY_EDITOR预处理块中使用。onlyTopCollider是否只向最顶层的碰撞体发送消息。此值会传给tpea.SetTouch方法由TouchPadEventArgs内部实现射线检测时使用。[Tooltip]仅作用于Inspector 面板用来给变量添加鼠标悬浮提示文字2.4 私有字段临时变量字段类型作用hitListListCollider2D当前帧按下的碰撞体列表或上一帧的列表newHitListListCollider2D新一帧的碰撞体列表实时射线检测结果tpeaTouchPadEventArgs复用的参数对象减少 GC 分配pointerIDint当前活动的指针 ID用于多点触控过滤oldPositionVector2上一帧的屏幕坐标2.4.1pointerIDpointerID确保了用户拖拽哪张牌系统就准确响应哪张牌即使另一根手指不小心碰到屏幕也不会造成干扰。方面说明核心作用唯一标识并追踪一个特定的触摸点主要使用场景按下时记录拖拽/抬起的验证多点触控隔离取值来源PointerEventData.pointerIdTouchPad或Touch.fingerIdTouchPadS典型值示例鼠标-1 或固定值如10触摸第1指0第2指1不使用的后果多点触控时状态混乱拖拽目标错误2.5 单例3.单例与初始化Awake单例如果已存在实例则销毁当前对象否则将自己设为单例。保证场景里 永远只能有一个该脚本对象第一次加载赋值自己为唯一实例重复挂载 / 多复制物体自动删掉多余的4. 事件回调详细解析4.1 OnPointerDown - 按下通过IsTouched确保只有第一次按下被处理防止多点触控中第二个手指触发。重新创建tpea这里产生了 GC是潜在的优化点。SetTouch内部进行射线检测填充tpea.hits。使用ExecuteEvents.ExecuteTouchPadMessageTarget向所有命中碰撞体发送PointerDown消息。记录第一个命中物体的TouchPadMessageTarget组件到tpea.firstSelected。触发外部事件ScreenPointerDownEvent。