Version: Unity 6.0 (6000.0)
语言 : 中文
元素的焦点顺序
操控器

使用自定义控件响应事件

如果您要实现自定义控件,则可以通过两种方式响应__ UI__(即用户界面,User Interface)让用户能够与您的应用程序进行交互。Unity 目前支持三种 UI 系统。更多信息
See in Glossary
工具包事件:

您选择如何响应事件取决于具体情况。以下是回调和虚拟方法覆盖之间的差异:

  • 回调必须在类的实例上注册。虚拟方法需要修改类本身。
  • 默认操作在性能上略有优势,因为它们在传播阶段不需要在回调注册表中进行查找。

覆盖 HandleEventBubbleUp 或 HandleEventTrickleDown 虚拟方法

虚拟方法覆盖适用于类的所有实例。对于覆盖 HandleEventBubbleUpHandleEventTrickleDown 的类,还可以在其实例上注册回调。

要覆盖 HandleEventBubbleUpHandleEventTrickleDown 方法或覆盖两者,需要派生新的 VisualElement 子类。

HandleEventBubbleUpHandleEventTrickleDown 是视觉元素子类的每个实例在接收事件时执行的操作。

以下示例展示了如何自定义这些虚拟方法:

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
}

对于给定的类实例,在以下情况下执行自定义代码具有相同的结果:

  • 在 BubbleUp 阶段的回调设置中
  • 在 HandleEventBubbleUp 方法覆盖中

在这两种情况下,如果停止事件的传播,则会阻止在执行当前目标回调和方法覆盖后对事件做出反应。

最佳实践

以下是使用自定义控件处理事件的最佳做法。

实现行为

要从元素实现行为,通常需要使用 HandleEventBubbleUp 方法覆盖。

鉴于 BubbleUp 是回调的默认传播阶段,您可以将任何代码从回调移动到 HandleEventBubbleUp 方法,而无需考虑更改代码执行的时间。

将行为作为方法覆盖来实现的好处包括:

  • 方法覆盖不需要在回调注册表中进行查找。
  • 没有回调的实例不进入传播过程。

停止事件传播

在回调或虚拟方法覆盖中处理事件时,可以通过调用事件上的 StopPropagation 方法之一来停止进一步的事件传播。例如,父面板可通过在涓流阶段停止传播,以阻止其子面板接收事件。

您无法阻止在事件类本身中执行 EventBase.PreDispatch()EventBase.PostDispatch() 方法。

以下方法影响事件传播:

  • StopImmediatePropagation():立即停止事件传播流程,以防止为事件执行任何后续回调。
  • StopPropagation():在当前元素的上一次回调后停止事件传播过程。这将确保当前元素的所有回调都得以执行,但是其他元素不会再对事件做出反应。

其他资源

元素的焦点顺序
操控器
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961