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

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 和移动端触摸逻辑。

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

相关文章:

  • 2026 年安徽靠谱的护壁膨润土批发厂家推荐,打桩最怕塌孔?这玩意儿能帮你守好地下那道墙!-亿通膨润土 - 行业推荐官-2
  • 2026合肥老年人配眼镜专业店铺**一览 - 奔跑123
  • 2026年宁波彩色水泥基自流平怎么选靠谱厂家 - 奔跑123
  • 2026年靠谱开放式热流道系统供应商推荐参考 - 奔跑123
  • 2026 年现阶段,汪清靠谱的危险品怎么办理公司哪个好,原来不用跑断腿也能搞定?这件关乎安全的事,竟有这么多省力门道 - 品质体验官
  • 2026 年 7 月新发布:安塞诚信的工厂平台秤订做厂家全面解析与选购指南,车间里悄悄替老板省出季度耗材费的,竟是这台不起眼的工业秤? - 企业推荐官【认证】
  • 2026年8月安徽省淮北市移动宽带怎么报装 - 找卡家园
  • 2026年8月中旬2026年8月中旬南充广告设计制作安装|华蔓广告|门头招牌,发光字,软膜灯箱等标识制作最新价格行情 - 四川华蔓广告有限公司
  • 2026年8月北京市移动单宽带怎么选_避坑指南 - 找卡家园
  • 2026年8月佛山市移动1000M宽带申请避坑攻略 - 找卡家园
  • 2026 年至今,乌恰诚信的金属板改色膜承运商哪家强,用这玩意儿贴一贴,旧金属板居然能焕新还省一半成本? - 企业推荐官-
  • 2026广东知识产权全链条服务机构实力**盘点 - 奔跑123
  • 2026年浙江导电抗静电PS粒子源头工厂推荐 - 奔跑123
  • 2026年IBM与红帽发布Lightwell:依托AI自动化修复漏洞,助力企业开源软件安全升级
  • 2026年针阀式热流道系统选哪家 甬宁模具科技全面评测 - 奔跑123
  • 2026年8月北京市移动1000M宽带怎么安装 - 找卡家园
  • 2026年北京地区专业geo公司相关参考推荐整理 - 奔跑123
  • 2026年8月佛山市移动1000M宽带避坑与办理指南 - 找卡家园
  • 2026年8月安徽省合肥市移动宽带实测办理全流程 - 找卡家园
  • 2026年浙江工业同步带哪家口碑好 蓬山同步带深度测评 - 奔跑123
  • 2025年C++开发环境搭建:VSCode+CMake+多编译器跨平台配置指南
  • UAssetGUI:专业级虚幻引擎资产离线编辑解决方案
  • 2026年8月北京市移动300M宽带办理申请全攻略与真实避坑经验 - 找卡家园
  • 2026 年当下,温州口碑好的6.1 类毒性物质运输服务商推荐几家,那批连专业车队都不敢接的货物,到底藏着什么秘密?-京王国际物流 - 企业官方推荐【认证】
  • 2026年南昌办公室写字楼新风系统靠谱服务商**盘点 - 奔跑123
  • 2026年找浙江导电抗静电PS粒子源头工厂看这里 - 奔跑123
  • 2026年针阀式热流道系统推荐哪个厂家 深度测评对比 - 奔跑123
  • 2026年华东地区双面齿同步带厂家选型实力评测对比 - 奔跑123
  • 2026年太原地区艺考生美术培训学校相关情况介绍 - 奔跑123
  • 2026年8月佛山市移动1000M宽带避坑攻略 - 找卡家园