欢迎光临散文网 会员登陆 & 注册

Unity 事件系统(Event System)

2023-05-11 21:58 作者:小左在做游戏  | 我要投稿

事件系统是一种基于输入(可以是键盘、鼠标、触摸或者自定义输入),将对应事件发送到程序中的对象的方式。当你将事件系统组件(EventSystem)添加到游戏对象时(新建UI时通常会直接附带一个),会发现它基本没有组件上的功能,这是因为事件系统本身被设计为事件系统模块之间通信的枢纽。

它的主要起如下作用:

① 管理被选择的游戏对象;

② 管理正在使用的输入模块

③ 管理射线检测(如需要)

④ 根据需求更新所有输入模块

输入模块(Input Modules)

输入模块是你事件系统运行主要逻辑的所在位置,它们用于:

① 处理输入

② 管理事件状态

③ 将事件发送到场景中的对象。

一个场景中只能有一个输入模块在事件系统中处于活动状态,并且它必须是与事件系统组件在同一游戏对象上。

如果想编写一个自定义的输入模块扩展和编写您自己的事件,发送Unity中的现有UI组件支持的事件。要参阅Messaging System文档(这部分后面有机会将单独讲解)。

输入模块是事件系统中可以进行配置和定制的主要逻辑部分。默认配置了两个输入模块,一个用于独立游戏的输入(Standalone Input Module),另一个用于触摸输入设计(已被集成到前面),模块将按照既定配置来接收和分派事件。

输入模块是事件系统的“逻辑”开始的地方。当启用事件系统时,它会查看那些输入模块中方式被触发了,并将更新处理传递给特定的模块。其设计目的支持你希望的输入系统进行扩展或修改,将外部特定的输入(如触摸、遥杆、鼠标、运动控制器)变成事件传递到事件系统中派发。内置输入模块支持常见的游戏配置,如触摸输入、控制器输入、键盘输入和鼠标输入。如果你在 MonoBehavior 上实现了特定接口,它也会将各种事件发送到应用程序中的控件。所有UI组件都将支持对应的特定接口。

Standalone Input Module

该模块是用来设置你所望的控制器/鼠标如何工作,包括按钮按下、拖动等输入的以获得相应。当鼠标/输入设备移动时,该模块将指针事件发送到组件,并通过Graphics Raycaster和Physics Raycaster来计算指针当前指向哪个物体。为了满足需求,还可以配置这些Raycaster检测或忽略场景的某部分。

该模块发送移动(move)和提交/取消(submit/cancel)事件,来响应通过输入窗口的输入。这适用于键盘和控制器的输入,被监听的Axis和按键可以在模块中进行配置。

 

参数                                            作用

Horizontal Axis(水平轴) 

Type the desired manager name for the horizontal axis button.(水平轴按钮在管理器中的名称)

Vertical Axis(垂直轴)

Type the desired manager name for the vertical axis.(垂直轴按钮在管理器中的名称)

Submit Button(确认键)

Type the desired manager name for the Submit button.(确认键按钮在管理器中的名称)

Cancel Button(取消键)

Type the desired manager name for the Cancel button.(取消键按钮在管理器中的名称)

Input Actions Per Second(每秒最大输入数)

Number of keyboard/controller inputs allowed per second.(每秒允许的键盘/控制器输入数)

Repeat Delay(重复延迟)

Delay in seconds before the input actions per second repeat rate takes effect.(每秒重复输入操作生效之前的延迟)

射线系统(Raycasters

事件系统需要一种方法来检测当前输入事件需要发送到的位置,这就由射线系统提供。给定一个屏幕空间坐标,他们将收集所有潜在的目标对象,找出它们是否在给定的位置下,然后返回最接近屏幕的对象。

系统提供了三种射线系统:

Graphic Raycaster-用于画布上UI界面元素组件

Physics 2D Raycaster - 用于2D物理组件

Physics Raycaster - 用于3D物理组件

如果您在场景中配置了2D / 3D Physics Raycaster,只需附加一个实现事件接口之一的脚本,则很容易使非UI元素从输入模块接收消息。如果使用了多个Raycaster,那么它们都会发射射线,结果将根据到目标的距离进行排序。

Graphic Raycaster


新建的Canvas中将自带Graphic Raycaster组件,将监听Canvas上的所有图形,并确定是否有一个被触发事件。

Ignore Reversed Graphics(忽略背面图形)

Should graphics facing away from the raycaster be considered(如果勾选,Raycaster将忽略Canvas中被翻转的图形)

注:接收事件组件沿X或Y轴翻转180°

Blocked Objects(遮挡物体)

该Canvas上的射线将被2D或者3D物体遮挡.

注:阻挡物件必须有对应的Collider,必须与下方同时启用

Blocking Mask(遮挡层)

该Canvas上的射线将被所选择的层遮挡.

注:阻挡物件必须有对应的Collider,必须与上方同时启用

Canvas 被遮挡的效果需要修改Canvas的 RenderMode为Screen Space - Camera 或者 World Space,此时视觉效果遮挡关系与视觉效果相同。

Physics Raycaster/Physics 2D Raycaster

两种射线系统针对场景中的2D和3D物体,同时这两个组件目前直接被绑定在相机上。

Max number of ray intersection表示最大射线的交互数,如设为0则是自动分配,其他值都将采取非自动调配模式。

参考内容:unity3d 文档:https://docs.unity3d.com/2022.2/Documentation/Manual/EventSystem.html.

 


Unity 事件系统(Event System)的评论 (共 条)

分享到微博请遵守国家法律