news 2026/4/25 5:42:22

TouchPad(单例)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 5:42:16

OpenYida:AI驱动低代码开发,自然语言生成宜搭应用

1. 从零到一&#xff1a;OpenYida 如何重塑低代码开发体验如果你是一名开发者&#xff0c;或者对低代码平台有所了解&#xff0c;那你肯定听说过宜搭&#xff08;Yida&#xff09;。它让业务人员也能快速搭建应用&#xff0c;但当你需要构建一个稍微复杂点的系统&#xff0c;比…

作者头像 李华
网站建设 2026/4/25 5:41:28

AI Agent控制平台Council:统一LLM接口与可扩展监督架构解析

1. 项目概述&#xff1a;Council&#xff0c;一个为AI Agent而生的一站式控制平台如果你正在用大语言模型&#xff08;LLM&#xff09;构建应用&#xff0c;无论是智能客服、内容生成工具&#xff0c;还是复杂的决策系统&#xff0c;你大概率会遇到几个绕不开的痛点&#xff1a…

作者头像 李华
网站建设 2026/4/25 5:41:23

混淆矩阵详解:分类模型性能评估的核心工具

1. 理解混淆矩阵&#xff1a;分类模型性能的显微镜 在机器学习项目中&#xff0c;我们常常会陷入一个误区&#xff1a;仅凭准确率(accuracy)就判断模型的好坏。这就像用体温计测量病人的整体健康状况——虽然重要但远远不够。想象一下&#xff0c;一个检测罕见疾病&#xff08;…

作者头像 李华
网站建设 2026/4/25 5:41:13

RAG系统幻觉检测技术原理与实践优化

1. RAG幻觉检测技术概述在信息检索与生成系统(RAG)的实际应用中&#xff0c;幻觉问题一直是影响输出质量的关键瓶颈。所谓"幻觉"&#xff0c;指的是模型生成的回答看似合理却包含事实性错误或虚构内容的现象。这种现象在医疗咨询、法律建议等专业领域尤为危险&#x…

作者头像 李华
网站建设 2026/4/25 5:39:21

品牌智能增长效果如何评估?三大核心指标拆解

当下&#xff0c;很多品牌投入大量资源布局品牌智能增长&#xff0c;却普遍面临一个核心困境&#xff1a;AI 在解答用户相关问题时&#xff0c;鲜少提及自身品牌。其症结在于&#xff1a;AI 平台品牌增长的效果评估&#xff0c;不可套用传统 SEO 的逻辑框架。与 SEO 聚焦搜索排…

作者头像 李华
网站建设 2026/4/25 5:34:07

华北理工大学特色培养项目解析:钢铁碳中和学院实验班与产教融合

很多考生和家长在了解华北理工大学时&#xff0c;会关注一个很实际的问题&#xff1a;华北理工大学有校企合作或实验班吗&#xff1f;学校有没有比较有特色的人才培养项目&#xff1f;从目前学校的人才培养布局来看&#xff0c;华北理工大学是有校企合作、实验班和产教融合特色…

作者头像 李华