news 2026/8/8 0:38:00

Unity MyFramework 用法说明(三十):使用 GlobalTouchSystem 统一处理 UI 与场景交互

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Unity MyFramework 用法说明(三十):使用 GlobalTouchSystem 统一处理 UI 与场景交互

上一篇介绍了InputSystem,它负责收集鼠标和触摸状态。但触点按下之后,到底命中了哪个 UI、哪个场景物体,以及事件是否继续向下穿透,还需要另一套系统处理。

MyFramework 使用GlobalTouchSystem统一完成 UI 与场景物体的射线检测和交互事件分发。

项目地址:

https://github.com/ZHOURUIH/MyFramework

一、GlobalTouchSystem 负责什么

GlobalTouchSystem的定位是替代传统 UGUIEventSystem,让框架中的 UI 和场景对象使用同一套交互流程。

它主要负责:

注册可交互对象 按照显示层级检测 UI 按照距离检测场景物体 处理点击、按下、悬停和移动 管理射线穿透 支持多个摄像机 限制当前允许操作的对象

整体流程为:

InputSystem 收集触点 ↓ GlobalTouchSystem 发射射线 ↓ 先检测 UI ↓ 允许穿透时继续检测场景对象 ↓ 向命中的对象发送交互事件

二、注册普通 UI 点击

UI 节点使用myUGUIObject注册:

public class UIMain : LayoutScript { protected myUGUIObject mStartButton; public override void assignWindow() { newObject(out mStartButton, "StartButton"); } public override void onGameState() { base.onGameState(); mStartButton.registeCollider( onStartClick); } protected void onStartClick() { log("点击开始游戏"); } }

注册时,框架会:

查找或创建碰撞体 将节点加入 GlobalTouchSystem 注册点击回调 默认阻挡后方射线 开启节点更新

节点不需要挂 Unity 原生的Button组件。

需要按钮的悬停变暗和按下位移效果时,可以使用:

mStartImage.registeColliderImage( onStartClick);

其中mStartImagemyUGUIImageSimple

三、监听更完整的交互状态

除了点击,还可以同时监听悬停和按下状态:

mStartButton.registeCollider( onStartClick, onStartHover, onStartPress); protected void onStartClick() { log("点击"); } protected void onStartHover(bool hover) { log("悬停状态:" + hover); } protected void onStartPress(bool press) { log("按下状态:" + press); }

框架中的ComponentInteractive还支持:

单击与双击 触点进入与离开 触点按下与抬起 触点移动与静止 长按 全屏按下与抬起 拖拽悬停与接收

例如注册长按:

mStartButton.addLongPress( onLongPress, 1.0f); protected void onLongPress() { log("长按1秒"); }

四、注册场景中的物体

场景物体需要继承或包装为MovableObject,并指定用于射线检测的摄像机:

protected MovableObject mMonster; protected void initMonster() { mMonster.setClickCallback( onMonsterClick); mMonster.setHoverCallback( onMonsterHover); mMonster.setPassRay(false); mGlobalTouchSystem.registeCollider( mMonster, mCameraManager.getMainCamera()); } protected void onMonsterClick() { log("点击怪物"); } protected void onMonsterHover(bool hover) { log("怪物悬停:" + hover); }

场景对象必须能够获得Collider

GlobalTouchSystem会根据射线交点与摄像机的距离排序,优先通知距离更近的对象。

MovableObject.destroy()时会自动从系统中注销,不需要业务层再次清理。

五、UI 为什么会优先于场景物体

全局射线检测会先遍历 UI 摄像机:

按照摄像机深度排序 ↓ 按照 UI 深度排序 ↓ 检测命中的 UI 节点

只有 UI 允许射线继续穿透时,才会检测场景物体。

因此玩家点击界面按钮时,不会同时点中按钮后面的怪物。

UI 的前后关系由框架生成的UIDepth决定,而不是简单依赖对象注册顺序。

六、控制射线穿透

默认注册点击节点时不允许穿透:

mButton.registeCollider( onClick);

等价于:

mButton.registeCollider( onClick, false);

需要点击自己后继续检测下方对象:

mTransparentArea.registeCollider( onAreaClick, true);

也可以单独修改:

mTransparentArea.setPassRay(true);

射线穿透适合:

纯装饰 UI 不会阻挡场景操作的透明区域 需要同时通知上下层对象的特殊交互

普通按钮、输入框和滑动区域通常不应该穿透。

七、滑动区域中的父子节点

滑动列表中,子节点只有位于Viewport范围内时才应该响应点击。

框架可以绑定:

bindPassOnlyParent(mViewport);

它表示:

子节点必须位于父节点碰撞区域内 才能继续接收射线检测

LayoutScript.registeScrollRect()已经会自动完成相关注册:

registeScrollRect( mScroll, mViewport, mContent);

业务层一般不需要再手动处理滑动列表的射线裁剪。

八、限制当前可操作对象

新手引导经常要求玩家只能点击指定按钮,其他位置都不响应。

可以设置:

mGlobalTouchSystem.setActiveOnlyObject( mGuideButton);

如果目标位于滑动列表或多层父节点中,应使用:

mGlobalTouchSystem .setActiveOnlyObjectWithAllParent( mGuideButton);

它会把目标及已经注册的父节点一起加入允许列表,保证父级滑动或遮罩逻辑仍然正常。

允许多个对象:

mGlobalTouchSystem.addActiveOnlyObject( mConfirmButton); mGlobalTouchSystem.addActiveOnlyObject( mCancelButton);

解除限制时,可以传入空对象:

mGlobalTouchSystem.setActiveOnlyObject( null);

这类接口适合:

新手引导 强制确认弹窗 指定区域教学 UGC 编辑器当前工具限制

九、查询当前位置命中的对象

需要主动判断鼠标当前指向谁时,可以调用:

IMouseEventCollect hoverObject = mGlobalTouchSystem.getHoverObject( Input.mousePosition);

获取全部命中对象:

protected HashSet<IMouseEventCollect> mHoverList = new(); protected void checkHover() { mGlobalTouchSystem.getAllHoverObject( mHoverList, Input.mousePosition); }

返回列表已经按照 UI 层级或场景距离排列,可以用于拖拽目标检测、编辑器选择和自定义提示。

十、对象生命周期

注册过的对象不应绕过框架直接销毁。

UI 节点通过框架销毁时,会自动执行:

mGlobalTouchSystem.unregisteCollider( window);

MovableObject.destroy()也会自动注销。

需要临时取消交互但保留对象时,可以使用:

mButton.setHandleInput(false);

恢复:

mButton.setHandleInput(true);

这比反复注册和注销更适合短时间禁用按钮。

十一、总结

MyFramework 的输入处理分为两层:

InputSystem 收集键盘、鼠标和触摸状态 GlobalTouchSystem 检测触点命中的对象并分发事件

常用接口包括:

obj.registeCollider(...); obj.registeColliderImage(...); obj.setPassRay(...); obj.setHandleInput(...); mGlobalTouchSystem.registeCollider( movable, camera); mGlobalTouchSystem.setActiveOnlyObject(...); mGlobalTouchSystem.getHoverObject(...);

通过统一管理 UI 深度、场景距离、射线穿透和对象生命周期,业务层不需要分别维护 UGUI 点击、Physics Raycast 和移动端触摸逻辑。

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

网盘直链下载助手:解锁你的网盘下载新姿势,告别龟速下载的烦恼

网盘直链下载助手&#xff1a;解锁你的网盘下载新姿势&#xff0c;告别龟速下载的烦恼 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / …

作者头像 李华
网站建设 2026/8/8 0:00:59

Claude Code团队配置管理:.claude目录实现开发环境标准化与技能共享

1. 从“人肉同步”到“配置即代码”&#xff1a;团队协作的痛点与解法每次新加入一个项目&#xff0c;或者换一台新电脑&#xff0c;你是不是都要花上半天甚至一天的时间&#xff0c;去重新配置你的开发环境&#xff1f;从安装Claude Code插件&#xff0c;到设置各种技能&#…

作者头像 李华
网站建设 2026/8/7 23:52:39

炉石传说HsMod终极指南:解锁50+游戏增强功能的免费工具箱

炉石传说HsMod终极指南&#xff1a;解锁50游戏增强功能的免费工具箱 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 炉石传说HsMod是基于BepInEx框架开发的游戏增强插件&#xff0c;为玩家…

作者头像 李华
网站建设 2026/8/7 23:52:02

如何免费修复损坏二维码:QRazyBox终极完整指南

如何免费修复损坏二维码&#xff1a;QRazyBox终极完整指南 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否遇到过无法扫描的二维码&#xff1f;打印模糊、物理损坏、信息丢失的二维码现…

作者头像 李华
网站建设 2026/8/7 23:43:20

终极指南:如何免费下载中国大学MOOC课程实现离线学习

终极指南&#xff1a;如何免费下载中国大学MOOC课程实现离线学习 【免费下载链接】MoocDownloader An MOOC downloader implemented by .NET. 一枚由 .NET 实现的 MOOC 下载器. 项目地址: https://gitcode.com/gh_mirrors/mo/MoocDownloader 你是否经常因为网络不稳定而…

作者头像 李华
网站建设 2026/8/7 23:32:44

AI漫剧实战:基于智能体工作流实现自动化内容创作

1. 项目概述&#xff1a;从零到一的AI漫剧实战最近在内容创作圈子里&#xff0c;AI漫剧成了一个绕不开的热词。无论是刷短视频还是逛内容社区&#xff0c;你都能看到那种由AI生成的、带有动态分镜和配音的短剧内容&#xff0c;它们节奏快、视觉冲击力强&#xff0c;很容易在几分…

作者头像 李华