版本:Unity 6 (6000.0)
语言:English
元素的焦点顺序
操纵器

使用自定义控件响应事件

如果您正在实现自定义控件,您可以通过以下方式响应UI(用户界面) 允许用户与您的应用程序交互。Unity 目前支持三种 UI 系统。 更多信息
参见 术语表
工具包事件

您对事件的响应取决于具体情况。以下是回调和虚方法覆盖之间的区别

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

覆盖 HandleEventBubbleUp 或 HandleEventTrickleDown 虚方法

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

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

当某个实例收到事件时,HandleEventBubbleUpHandleEventTrickleDown 会在视觉元素视觉树的一个节点,它实例化或派生自 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
}

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

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

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

最佳实践

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

实现行为

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

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

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

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

停止事件传播

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

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

以下方法会影响事件传播

  • StopImmediatePropagation():立即停止事件传播过程,以防止事件的任何后续回调执行。
  • StopPropagation():在当前元素上的最后一个回调之后停止事件传播过程。这确保所有回调都在当前元素上执行,同时防止任何其他元素响应事件。

其他资源

元素的焦点顺序
操纵器