Unity中的UGUI事件系统
发布日期:2021-06-30 19:57:07
浏览次数:2
分类:技术文章
本文共 2693 字,大约阅读时间需要 8 分钟。
当我们在场景中创建任一UI对象后,Hierarchy面板中都可以看到系统自动创建了EventSystem对象,EventSystem对象负责管理所有事件相关对象,该对象下挂载了EventSystem组件和StandaloneInputModule组件,前者为管理脚本,后者为输入模块。Canvas对象下挂载了GraphicRaycaster负责处理射线相关运算,用户的操作都会通过射线检测来映射到UGUI组件上,InputModule将用户的操作转化为射线检测,Raycaster则找到目标对象并通知EventSystem,最后EventSystem发送事件让目标对象进行响应。
总结来说就是:EventSystem负责管理,BaseInputModule负责输入,BaseRaycaster负责确定目标对象,目标对象负责接收事件并处理,然后一个完整的事件系统就有了
一:EventSystem事件系统
一个场景中只能有一个EventSystem组件 ——First Selected:第一次默认选择的物体 ——Send Navigation Events:是否可以使用导航事件(键盘上下左右)控制 ——Drag Threshold:视为拖拽操作的最小距离二:EventInterface事件接口
(实现Tooltip)
——IPointerEnterHandler 鼠标进入时响应——IPointerExitHandler 鼠标离开时响应——IPointerDownHandler 在可视元素矩形区域内按下时响应 ——IPointerUpHandler
在可视元素矩形区域内按下后,在任意区域抬起时响应 ——IPointerClickHandler 在可视元素矩形区域内按下后,在同一可视元素矩形区域内抬起时响应(实现背包物体交换)
——IBeginDragHandler 开始拖动时相应——IDragHandler 拖动中时相应——IEndDragHandler 结束拖动时相应——IDropHandler 接收拖动事件,必须先实现IDragHandler例子:物体A上实现了IDragHandler,物体B上实现了IDropHandler,从物体A上开始Drag,在物体A上结束Drag,没有触发OnDrop。从物体A上开始Drag,在物体B上结束Drag,可以触发OnDrop ——IInitializePotentialDragHandler 与IPointerDownHandler触发条件大致相同,几乎没用 ——IScrollHandler 鼠标滚动滚动时响应——ISelectHandler
每次选择UI元素时响应,但是如果此物体不是Button这种有选择操作的UI元素,需要写代码进行选择:EventSystem.current.SetSelectedGameObject(gameObject) ——IDeselectHandler 每次取消选择UI元素时响应,点击此可视元素矩形区域外即为取消选择 ——IUpdateSelectedHandler 选择了UI元素时一直响应(与BuildSettings—PlayerSettings—Input中的设置相对应。与Select相关的三个接口类似也需要元素本身具有选择操作)
——IMoveHandler 与Horizontal和Vertical相对应 ——ISubmitHandler 与Submit相对应 ——ICancelHandler 与Cancal相对应三:EventData事件数据
——BaseEventData:基础事件数据—事件数据的基类
——PointerEventData:光标事件数据—鼠标与触摸的相关数据(进入,点击,拖动),UGUI的大部分事件数据的类型都是PointerEventData 1.button:鼠标的(左,中,右)键哪个键点击的 2.clickCount:连续点击的次数(从1开始累加) 3.clickTime:当前点击的时间(根据上一次点击的时间累加)4.position:鼠标当前的位置 5.pressPosition:鼠标点击时的位置 6.delta:当前点击与上一次点击的位置差值 7.dragging:是否为拖拽状态(不受EventSystem组件上Drag Threshold的影响,只在使用OnDrag相关事件接口时才起作用)8.pointerEnter:鼠标进入时的物体 9.pointerPress:鼠标点击时的物体(OnPointerDown,OnPointerEnter等没有鼠标抬起的事件不能使用,因为没有抬起并不算一次点击) 10.pointerDrag:鼠标拖拽的物体 11.lastPress:最后一次点击的物体 12.rawPointerPress:第一次点击的物体 13.worldNormal:射线检测到的第一个物体的法线 14.enterEventCamera:鼠标进入时的相机 15.pressEventCamera:鼠标点击时的相机 16.pointerCurrentRaycast:鼠标进入时的射线信息 17.pointerPressRaycast:鼠标点击时的射线信息 ——AxisEventData:轴向事件数据—手柄和键盘中控制轴向的相关数据(参考BuildSettings—PlayerSettings—Input中的设置)四:Raycaster射线检测
UGUI的射线检测是从摄像机发起的并配合碰撞器 必须与Canvas组件一起挂载在同一物体身上 1.Ignore Reversed Graphics:忽略颠倒的图形的射线检测,即旋转180°后的图片不会与射线发生检测 2.Blocking Objects:屏蔽指定类型的物理(必须添加碰撞器)对象,使它们不参与射线检测(渲染模式不为Overlay并添加渲染相机时起作用) 3.Blocking Mask:使屏蔽对象中的指定层不参与射线检测(渲染模式不为Overlay并添加渲染相机且Blocking Objects不为None时起作用)——PhysicsRaycaster和Physics2DRaycaster
必须与Camera组件一起挂载在同一物体身上,给挂载了Camera物体的同一物体添加PhysicsRaycaster组件就可以让3D物体利用EventSystem响应事件了 1.Event Mask::屏蔽指定层不参与射线检测转载地址:https://liuhaowen.blog.csdn.net/article/details/104008976 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年05月03日 12时56分11秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
mysql——介绍及安装与基本用法
2019-04-30
MySQL数据库之索引
2019-04-30
MYSQL——事务操作+视图+存储引擎
2019-04-30
Mysql——完全备份+增量备份+备份恢复
2021-07-03
MySQL进阶查询(SELECT 语句高级用法)
2021-07-03
Mysql 之主从复制
2019-04-30
LVS负载均衡------NAT模式
2019-04-30
squid代理-----透明代理模式
2019-04-30
squid代理介绍----ACL控制应用+sarg日志分析+反向代理
2019-04-30
redis集群之主从模式+哨兵模式
2019-04-30
JavaScript原生开关灯效果
2019-04-30
企业邮箱如何申请注册,邮箱申请如何免费注册?
2019-04-30
微信企业邮箱,手机邮箱格式地址怎么写?
2019-04-30
公司如何申请企业邮箱,公司邮箱怎么申请,公司企业邮箱哪个好?
2019-04-30
电子邮箱账号怎么申请,怎样申请邮箱账号呢
2019-04-30
邮箱怎么发邮件,邮件发信量多少,职场新人怎么发汇报邮件呢?
2019-04-30
maven 多层次pom 新引入包,编译成功,还是没有将包引入到本地
2019-04-30
leetCode2 两数相加
2019-04-30