为了将您的事件逻辑与您的UI(用户界面) 允许用户与您的应用程序交互。 Unity 当前支持三种 UI 系统。 更多信息
参见 术语表 代码分离,请使用操纵器来处理事件。 操纵器是状态机动画控制器中角色或动画游戏对象可以处于的一组状态,以及这些状态之间的一组转换,以及一个用于记住当前状态的变量。 可用的状态将取决于游戏玩法类型,但典型状态包括空闲、行走、跑步和跳跃。 更多信息
参见 术语表,用于处理用户与 UI 元素的交互。 它们存储、注册和注销事件回调。 操纵器简化了设置用户交互,因此您不必一一处理每个回调。 要处理事件,请使用或继承 UI 工具包支持的其中一个操纵器。
创建和使用操纵器
下表列出了支持的操纵器类
操纵器 | 继承自 | 描述 |
---|---|---|
操纵器 |
所有提供的操纵器的基类。 | |
KeyboardNavigationManipulator |
操纵器 |
处理将设备特定的输入事件转换为使用键盘进行更高级别导航操作。 |
MouseManipulator |
操纵器 |
处理鼠标输入。 有一个激活过滤器列表。 |
ContextualMenuManipulator |
MouseManipulator |
当用户单击鼠标右键或按下键盘上的菜单键时显示上下文菜单。 |
PointerManipulator |
MouseManipulator |
处理指针输入。 有一个激活过滤器列表。 |
Clickable |
PointerManipulator |
跟踪元素上的鼠标事件,并识别何时发生单击,即在同一个元素上的指针按下和释放。 |
以下示例演示了如何使用操纵器来处理事件。 它们执行以下操作
PointerManipulators
类继承操纵器,该类处理鼠标输入。activators
列表指定激活操纵器的条件。 例如,要使操纵器在用户单击鼠标左键时激活,请将 ManipulatorActivationFilter
添加到 activators
列表中,并将 button
字段设置为 MouseButton.LeftMouse
。target
属性访问操纵器附加到的元素。RegisterCallbacksOnTarget
和 UnregisterCallbacksFromTarget
方法以注册和注销事件回调。以下示例创建了一个操纵器,当您单击并拖动它时,它会移动元素
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();
}
}
以下示例创建了一个操纵器,当您拖动它时,它会调整元素的大小
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());