版本:Unity 6 (6000.0)
语言:英语
使用自定义控件响应事件
合成和发送事件

操纵器

为了将您的事件逻辑与您的UI(用户界面) 允许用户与您的应用程序交互。 Unity 当前支持三种 UI 系统。 更多信息
参见 术语表
代码分离,请使用操纵器来处理事件。 操纵器是状态机动画控制器中角色或动画游戏对象可以处于的一组状态,以及这些状态之间的一组转换,以及一个用于记住当前状态的变量。 可用的状态将取决于游戏玩法类型,但典型状态包括空闲、行走、跑步和跳跃。 更多信息
参见 术语表
,用于处理用户与 UI 元素的交互。 它们存储、注册和注销事件回调。 操纵器简化了设置用户交互,因此您不必一一处理每个回调。 要处理事件,请使用或继承 UI 工具包支持的其中一个操纵器。

创建和使用操纵器

  1. 定义一个专用的类,该类继承自 UI 工具包支持的操纵器类。 该类封装了针对您要管理的特定用户交互量身定制的事件处理逻辑。
  2. 在该类中,实现方法以响应相关交互,例如鼠标单击或拖动。 这些方法捕获并处理执行所需行为所需的必要信息。
  3. 设计完操纵器类后,实例化它并将其附加到目标 UI 元素。 此附加操作使操纵器能够拦截和管理指定的事件,在保持与您的 UI 代码清晰分离的同时协调用户交互。

支持的操纵器

下表列出了支持的操纵器类

操纵器 继承自 描述
操纵器 所有提供的操纵器的基类。
KeyboardNavigationManipulator 操纵器 处理将设备特定的输入事件转换为使用键盘进行更高级别导航操作。
MouseManipulator 操纵器 处理鼠标输入。 有一个激活过滤器列表。
ContextualMenuManipulator MouseManipulator 当用户单击鼠标右键或按下键盘上的菜单键时显示上下文菜单。
PointerManipulator MouseManipulator 处理指针输入。 有一个激活过滤器列表。
Clickable PointerManipulator 跟踪元素上的鼠标事件,并识别何时发生单击,即在同一个元素上的指针按下和释放。

示例

以下示例演示了如何使用操纵器来处理事件。 它们执行以下操作

创建 ExampleDragger 操纵器

以下示例创建了一个操纵器,当您单击并拖动它时,它会移动元素

using UnityEngine;
using UnityEngine.UIElements;

public class ExampleDragger : PointerManipulator
{
    private Vector3 m_Start;
    protected bool m_Active;
    private int m_PointerId;
    private Vector2 m_StartSize;

    public ExampleDragger()
    {
        m_PointerId = -1;
        activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse });
        m_Active = false;
    }

    protected override void RegisterCallbacksOnTarget()
    {
        target.RegisterCallback<PointerDownEvent>(OnPointerDown);
        target.RegisterCallback<PointerMoveEvent>(OnPointerMove);
        target.RegisterCallback<PointerUpEvent>(OnPointerUp);
    }

    protected override void UnregisterCallbacksFromTarget()
    {
        target.UnregisterCallback<PointerDownEvent>(OnPointerDown);
        target.UnregisterCallback<PointerMoveEvent>(OnPointerMove);
        target.UnregisterCallback<PointerUpEvent>(OnPointerUp);
    }

    protected void OnPointerDown(PointerDownEvent e)
    {
        if (m_Active)
        {
            e.StopImmediatePropagation();
            return;
        }

        if (CanStartManipulation(e))
        {
            m_Start = e.localPosition;
            m_PointerId = e.pointerId;

            m_Active = true;
            target.CapturePointer(m_PointerId);
            e.StopPropagation();
        }
    }

    protected void OnPointerMove(PointerMoveEvent e)
    {
        if (!m_Active || !target.HasPointerCapture(m_PointerId))
            return;

        Vector2 diff = e.localPosition - m_Start;

        target.style.top = target.layout.y + diff.y;
        target.style.left = target.layout.x + diff.x;

        e.StopPropagation();
    }

    protected void OnPointerUp(PointerUpEvent e)
    {
        if (!m_Active || !target.HasPointerCapture(m_PointerId) || !CanStopManipulation(e))
            return;

        m_Active = false;
        target.ReleaseMouse();
        e.StopPropagation();
    }
}

创建 ExampleResizer 操纵器

以下示例创建了一个操纵器,当您拖动它时,它会调整元素的大小

using UnityEngine;
using UnityEngine.UIElements;

public class ExampleResizer : PointerManipulator
{
    private Vector3 m_Start;
    protected bool m_Active;
    private int m_PointerId;
    private Vector2 m_StartSize;
    public ExampleResizer()
    {
        m_PointerId = -1;
        activators.Add(new ManipulatorActivationFilter { button = MouseButton.LeftMouse });
        m_Active = false;
    }

    protected override void RegisterCallbacksOnTarget()
    {
        target.RegisterCallback<PointerDownEvent>(OnPointerDown);
        target.RegisterCallback<PointerMoveEvent>(OnPointerMove);
        target.RegisterCallback<PointerUpEvent>(OnPointerUp);
    }

    protected override void UnregisterCallbacksFromTarget()
    {
        target.UnregisterCallback<PointerDownEvent>(OnPointerDown);
        target.UnregisterCallback<PointerMoveEvent>(OnPointerMove);
        target.UnregisterCallback<PointerUpEvent>(OnPointerUp);
    }

    protected void OnPointerDown(PointerDownEvent e)
    {
        if (m_Active)
        {
            e.StopImmediatePropagation();
            return;
        }

        if (CanStartManipulation(e))
        {
            m_Start = e.localPosition;
            m_StartSize = target.layout.size;
            m_PointerId = e.pointerId;
            m_Active = true;
            target.CapturePointer(m_PointerId);
            e.StopPropagation();
        }
    }

    protected void OnPointerMove(PointerMoveEvent e)
    {
        if (!m_Active || !target.HasPointerCapture(m_PointerId))
            return;

        Vector2 diff = e.localPosition - m_Start;

        target.style.height = m_StartSize.y + diff.y;
        target.style.width = m_StartSize.x + diff.x;

        e.StopPropagation();
    }

    protected void OnPointerUp(PointerUpEvent e)
    {
        if (!m_Active || !target.HasPointerCapture(m_PointerId) || !CanStopManipulation(e))
            return;

        m_Active = false;
        target.ReleasePointer(m_PointerId);
        m_PointerId = -1;
        e.StopPropagation();
    }
}

添加或删除操纵器

要将操纵器添加到元素中,请使用 AddManipulator 方法。 要从元素中删除操纵器,请使用 RemoveManipulator 方法。

以下示例将 ExampleDragger 添加到和从 VisualElement 中删除

// Create a VisualElement.
var myElement = new VisualElement();

// Add manipulators to the VisualElement.
myElement.AddManipulator(new ExampleDragger());

// Remove manipulators from the VisualElement.
myElement.RemoveManipulator<ExampleDragger>();

以下示例将 ExampleResizer 添加到 VisualElement

var box = new VisualElement()
{
    style =
    {
        left = 100,
        top = 100,
        width = 100,
        height = 100,
        backgroundColor = Color.red
    },
    pickingMode = PickingMode.Position,
};

box.AddManipulator(new ExampleResizer());

其他资源

使用自定义控件响应事件
合成和发送事件