Unity之UI (二)
六、事件系统
1.消息系统
在UnityEngine.EventSystems命名空间中,使用"IEventSystemHandler"接口。
public interface ICustomMessageTarget : IEventSystemHandler
{
// 可通过消息系统调用的函数
void Message1();
void Message2();
}
定义此接口后,可以用MonoBehaviour实现,定义了在针对此 MonoBehaviour 游戏对象发出指定消息时将会执行的函数。
public class CustomMessageTarget : MonoBehaviour, ICustomMessageTarget
{
public void Message1()
{
Debug.Log ("Message 1 received");
}
public void Message2()
{
Debug.Log ("Message 2 received");
}
}
2.输入模块
(1)独立输入模块
当鼠标/输入设备移动时,该模块将指针事件发送到组件,并使用图形射线投射器 (Graphics Raycaster)和物理射线投射器 (Physics Raycaster) 来计算给定指针设备当前指向的元素。您可以配置这些射线投射器来检测或忽略场景的某些部分,从而满足您的要求。
该模块:
使用垂直/水平轴进行键盘和控制器导航
使用 Submit/Cancel 按钮发送提交和取消事件
在事件之间有一个超时值仅允许每秒的最大事件数。
该模块的流程如下
如果输入了 Input 窗口中的有效轴,则向所选对象发送 Move 事件
如果按下了 Submit 或 Cancel 按钮,则向所选对象发送 Submit 或 Cancel 事件
处理鼠标输入
如果这是新的按压操作
发送 PointerEnter 事件(向上发送到层级视图中可对其进行处理的每个对象)
发送 PointerPress 事件
缓存拖动处理程序(层级视图中可对其进行处理的第一个元素)
将 BeginDrag 事件发送到拖动处理程序
在事件系统中将“Pressed”对象设置为 Selected
如果这是持续按压操作
处理移动
将 DragEvent 发送到缓存的拖动处理程序
如果触摸在对象之间移动,则处理 PointerEnter 和 PointerExit 事件
如果这是释放操作
将 PointerUp 事件发送到收到 PointerPress 的对象
如果当前悬停对象与 PointerPress 对象相同,则发送 PointerClick 事件
如果缓存了拖动处理程序,则发送 Drop 事件
将 EndDrag 事件发送到缓存的拖动处理程序
处理滚轮事件
(2)触摸输入模块
该模块设计用于触摸设备,可发送触摸和拖动操作的指针事件来响应用户输入。该模块支持多点触控。
该模块使用场景配置的射线投射器来计算当前正在触摸的元素。每次当前触摸操作都将相应发出射线投射。
该模块的流程如下:
对于每个触摸事件
如果这是新的按压操作
发送 PointerEnter 事件(向上发送到层级视图中可对其进行处理的每个对象)
发送 PointerPress 事件
缓存拖动处理程序(层级视图中可对其进行处理的第一个元素)
将 BeginDrag 事件发送到拖动处理程序
在事件系统中将“Pressed”对象设置为 Selected
如果这是持续按压操作
处理移动
将 DragEvent 发送到缓存的拖动处理程序
如果触摸在对象之间移动,则处理 PointerEnter 和 PointerExit 事件
如果这是释放操作
将 PointerUp 事件发送到收到 PointerPress 的对象
如果当前悬停对象与 PointerPress 对象相同,则发送 PointerClick 事件
如果缓存了拖动处理程序,则发送 Drop 事件
将 EndDrag 事件发送到缓存的拖动处理程序
3.支持的事件
独立输入模块和触摸输入模块支持的事件由接口提供,通过实现该接口即可在 MonoBehaviour 上实现这些事件。如果配置了有效的事件系统,则会在正确的时间调用事件。
IPointerEnterHandler - OnPointerEnter - 当指针进入对象时调用
IPointerExitHandler - OnPointerExit - 当指针退出对象时调用
IPointerDownHandler - OnPointerDown - 在对象上按下指针时调用
IPointerUpHandler - OnPointerUp - 松开指针时调用(在指针正在点击的游戏对象上调用)
IPointerClickHandler - OnPointerClick - 在同一对象上按下再松开指针时调用
IInitializePotentialDragHandler - OnInitializePotentialDrag - 在找到拖动目标时调用,可用于初始化值
IBeginDragHandler - OnBeginDrag - 即将开始拖动时在拖动对象上调用
IDragHandler - OnDrag - 发生拖动时在拖动对象上调用
IEndDragHandler - OnEndDrag - 拖动完成时在拖动对象上调用
IDropHandler - OnDrop - 在拖动目标对象上调用
IScrollHandler - OnScroll - 当鼠标滚轮滚动时调用
IUpdateSelectedHandler - OnUpdateSelected - 每次勾选时在选定对象上调用
ISelectHandler - OnSelect - 当对象成为选定对象时调用
IDeselectHandler - OnDeselect - 取消选择选定对象时调用
IMoveHandler - OnMove - 发生移动事件(上、下、左、右等)时调用
ISubmitHandler - OnSubmit - 按下 Submit 按钮时调用
ICancelHandler - OnCancel - 按下 Cancel 按钮时调用
4.射线投射器
事件系统需要一种方法来检测当前输入事件需要发送到的位置,而此方法由射线投射器 (Raycaster) 提供。给定屏幕空间位置的情况下,射线投射器将收集所有潜在目标,确定它们是否在给定位置下,然后返回最接近屏幕的对象。提供了几种类型的射线投射器:
(1)图形射线投射器 (Graphic Raycaster) - 用于 UI 元素,位于画布上,并在画布中搜索
(2)2D 物理射线投射器 (Physics 2D Raycaster) - 用于 2D 物理元素
(3)物理射线投射器 (Physics Raycaster) - 用于 3D 物理元素
当场景中存在并启用了射线投射器时,只要从输入模块发出查询,事件系统就会使用该射线投射器。
如果使用多个射线投射器,那么这些射线投射器都会进行针对性投射,并且结果将根据与元素的距离进行排序。
七、富文本
1.标记格式
将文本的一部分包含在一对匹配标签内:
如示例所示,标签就是“尖括号”字符 < 和 > 内的文本片段。
标记的文本部分(包括将其包裹的标签)称为元素。
2.标签参数
有些标签对文本具有简单的“全有或全无”(all-or-nothing) 效果,但其他标签可能允许变化。例如,color 标签需要知道要应用的颜色。应使用参数将此类信息添加到标签中:
标签参数不能包含空格。支持的标签有: