当前位置: 首页 > news >正文

TouchPad(单例)

TouchPad是一个底层触摸输入管理器,直接挂载在场景中的 UI 或游戏物体上,通过实现 Unity 事件系统接口(IPointerDownHandler,IDragHandler,IPointerUpHandler,IBeginDragHandler,IDropHandler,IPointerExitHandler)来接收原始指针事件,并将其转换为:

  • C# 事件(供外部订阅,如ScreenDragEvent

  • ExecuteEvents消息(发送给碰撞体上的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/160478366

(Action = 可以存方法的变量,只能存 void 方法)

可以被外部订阅的委托字段

  • 作用:让外部脚本(如TouchManager)订阅并接收触摸事件,而不需要通过ExecuteEvents机制。

TouchPadEventArgshttps://blog.csdn.net/LFJINNAN/article/details/160482722?spm=1001.2014.3001.5502

2.2 属性声明

属性类型说明
ScreenTouchPosVector2当前触摸点的屏幕坐标(私有 set)
ScreenDragDirectionVector2计算当前拖拽方向(当前位置 - 上一帧位置)
WorldTouchPosVector3屏幕坐标转世界坐标,依赖Camera.main,若相机不存在则返回Vector3.zero
IsTouchedbool是否正在触摸中(按下后未抬起/退出)
IsActivebool触摸处理是否启用(可通过SetTouchActivity修改)
CameraMainCamera简写属性,返回Camera.main(每次调用都重新获取,注意性能)

注意:

  • ScreenTouchPosIsTouched只有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 私有字段(临时变量)

字段类型作用
hitListList<Collider2D>当前帧按下的碰撞体列表(或上一帧的列表)
newHitListList<Collider2D>新一帧的碰撞体列表(实时射线检测结果)
tpeaTouchPadEventArgs复用的参数对象,减少 GC 分配
pointerIDint当前活动的指针 ID(用于多点触控过滤)
oldPositionVector2上一帧的屏幕坐标
2.4.1pointerID

pointerID确保了用户拖拽哪张牌,系统就准确响应哪张牌,即使另一根手指不小心碰到屏幕也不会造成干扰。

方面说明
核心作用唯一标识并追踪一个特定的触摸点
主要使用场景按下时记录,拖拽/抬起的验证,多点触控隔离
取值来源PointerEventData.pointerId(TouchPad)或Touch.fingerId(TouchPadS)
典型值示例鼠标:-1 或固定值(如10);触摸第1指:0;第2指:1
不使用的后果多点触控时状态混乱,拖拽目标错误

2.5 单例

3.单例与初始化(Awake)

单例:如果已存在实例,则销毁当前对象;否则将自己设为单例。

保证场景里 永远只能有一个该脚本对象

  • 第一次加载:赋值自己为唯一实例
  • 重复挂载 / 多复制物体:自动删掉多余的

4. 事件回调详细解析

4.1 OnPointerDown - 按下

  1. 通过IsTouched确保只有第一次按下被处理(防止多点触控中第二个手指触发)。

  2. 重新创建tpea(这里产生了 GC,是潜在的优化点)。

  3. SetTouch内部进行射线检测,填充tpea.hits

  4. 使用ExecuteEvents.Execute<TouchPadMessageTarget>向所有命中碰撞体发送PointerDown消息。

  5. 记录第一个命中物体的TouchPadMessageTarget组件到tpea.firstSelected

  6. 触发外部事件ScreenPointerDownEvent

http://www.jsqmd.com/news/696402/

相关文章:

  • Nunchaku-flux-1-dev实现内网穿透工具开发:安全通信方案
  • Mac彻底清理指南:Pearcleaner让你的系统重获新生
  • 如何利用人工智能快速将传统起诉状转换成要素式起诉状
  • 「AMD AI 开发者日 2026」报名开启
  • 西安AI智能获客
  • GRBL_for_STM32:在STM32平台上构建高性能CNC控制器的完整指南
  • 详解Python的文件处理
  • 04-09-04 陈述观点 - 学习笔记
  • 主流招人渠道,为什么企业优先选择猎聘
  • 品牌智能增长效果如何评估?三大核心指标拆解
  • 【ES Kibana】Kibana 启动 statusCode: 429 报错
  • 惩罚回归模型实战:从标准化到超参数优化
  • 什么是隔离数字输入?安全与可靠性的数字桥梁
  • Windows Server 部署Docker Engine
  • 你的第一个OpenClaw ROCm Skill :在 AMD ROCm 全平台快速部署 vLLM
  • 深入理解Transformer:从Self-Attention到ChatGPT
  • 2026年热门的温州塑料验厂咨询/塑料验厂咨询/ISO45001企业体系认证验厂咨询品质保障公司 - 品牌宣传支持者
  • python文件处理笔记之文本文件
  • Primus-Pipeline:更灵活、可扩展的流水线并行实现
  • 终于找到了!新手导演制作微电影专用的AI工具,即梦Seedance 2.0让我直接起飞
  • 本土化再定义:从产品适配到系统共生的产业竞争升维
  • 毕设项目 stm32 RFID智能仓库管理系统(源码+硬件+论文)
  • 小白必看!零技术、零代码,用Open Claw 1688接口搞定选品监控
  • 2026年比较好的金属箱包验厂咨询/ISO45001企业体系认证验厂咨询/工艺品验厂咨询综合评价公司 - 行业平台推荐
  • 无锡佳钛合不锈钢有限公司三通的焊接工艺
  • Real Anime Z新手教程:Streamlit界面操作全流程(含路径校验与错误日志解读)
  • 智能体开发实战分享:利用 “_think“ 模式低成本模拟大模型“深度思考”
  • Python文件的操作处理详解
  • 智能导游中的路线规划与讲解服务
  • 个人第一篇博客