如果您正在实现自定义控件,您可以通过以下方式响应UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 术语表 工具包事件
您对事件的响应取决于具体情况。以下是回调和虚方法覆盖之间的区别
虚方法覆盖适用于类的所有实例。对于覆盖 HandleEventBubbleUp
或 HandleEventTrickleDown
的类,您也可以在其实例上注册回调。
要覆盖 HandleEventBubbleUp
或 HandleEventTrickleDown
方法(或两者),请派生 VisualElement
的新子类。
当某个实例收到事件时,HandleEventBubbleUp
和 HandleEventTrickleDown
会在视觉元素视觉树的一个节点,它实例化或派生自 C# VisualElement
类。您可以设置其外观,定义其行为,并将其作为 UI 的一部分显示在屏幕上。 更多信息
参见 术语表 子类的每个实例上执行。
以下示例演示如何自定义这些虚方法
override void HandleEventBubbleUp(EventBase evt)
{
// Call the base function.
base.HandleEventBubbleUp(evt);
if (evt.eventTypeId == PointerDownEvent.TypeId())
{
// ...
}
else if (evt.eventTypeId == MouseUpEvent.TypeId())
{
// ...
}
// More event types
}
对于给定的类实例,在以下情况下执行自定义代码具有相同的结果
在这两种情况下,如果您停止事件的传播,它将阻止在您执行当前目标回调和方法覆盖后对事件的反应。
以下是使用自定义控件处理事件的最佳实践。
通常,要从您的元素实现行为,请使用 HandleEventBubbleUp
方法覆盖。
鉴于 BubbleUp 是回调的默认传播阶段,您可以将任何代码从回调移动到 HandleEventBubbleUp
方法,而无需担心更改代码执行的时机。
将行为实现为方法覆盖的好处包括
在回调或虚方法覆盖中处理事件时,您可以通过在事件上调用其中一个 StopPropagation 方法来停止进一步的事件传播。例如,父面板可以在向下传播阶段停止传播,以防止其子级接收事件。
您无法阻止事件类本身内部 EventBase.PreDispatch()
和 EventBase.PostDispatch()
方法的执行。
以下方法会影响事件传播
StopImmediatePropagation()
:立即停止事件传播过程,以防止事件的任何后续回调执行。StopPropagation()
:在当前元素上的最后一个回调之后停止事件传播过程。这确保所有回调都在当前元素上执行,同时防止任何其他元素响应事件。