UnityEngine.Event 类主要用于处理即时模式 GUI(即通常所说的 UnityGUI 或 IMGUI)中的输入事件和布局渲染事件。它不属于新的 UI 系统(UGUI),而是与每帧调用的 OnGUI 方法紧密配合,让你能够直接获取键盘、鼠标和系统事件的信息。
1. 核心概念
- Event 类位于
UnityEngine 命名空间下。
- 它与用户输入(按键、鼠标操作)或 UnityGUI 的布局/渲染过程相对应。
- 每帧会多次调用
OnGUI,每次调用都可能伴随一个“当前事件”。通过静态属性 Event.current 可以获取该事件。
- 当你在
OnGUI 方法内编写代码时,Event.current 就是你即将处理的那个事件。
2. 常用静态变量
| 变量 | 说明 |
current |
当前待处理的 Event 对象,只在 OnGUI 调用期间有效。 |
3. 常用实例变量(只读属性,方便判断事件细节)
键盘相关
| 变量 | 说明 |
isKey |
当前事件是否为键盘事件。 |
keyCode |
键盘事件的原始键代码(如 KeyCode.A)。 |
character |
键入的字符(char 类型),对输入框很有用。 |
modifiers |
当前按住的修饰键(EventModifiers 枚举,可检测 Shift、Control、Alt、Command)。 |
alt / control / shift / command |
分别判断 Alt、Control、Shift、Command/Windows 键是否被按住。 |
capsLock |
Caps Lock 键是否打开。 |
numeric |
当前按键是否属于数字小键盘区域。 |
functionKey |
当前按键是否为功能键(F1~F15)。 |
鼠标相关
| 变量 | 说明 |
isMouse |
当前事件是否为鼠标事件。 |
button |
按下的鼠标按钮编号(0=左键,1=右键,2=中键)。 |
mousePosition |
鼠标的屏幕坐标(Vector2)。 |
delta |
相对于上一事件的鼠标移动增量。 |
clickCount |
连续鼠标点击次数(用于判断双击)。 |
事件类型与控制
| 变量 | 说明 |
type |
事件的类型(EventType 枚举),如 KeyDown、MouseDown、Repaint、Layout等。 |
commandName |
当类型为 ExecuteCommand 或 ValidateCommand 时的命令名称。 |
displayIndex |
事件所属显示器的索引(多显示器环境下有用)。 |
4. 常用公共方法
GetTypeForControl(int id)
- 获取针对特定控件 ID 过滤后的事件类型。
- 用于判断某个控件是否获得焦点或应采取何种响应。
Use()
- 调用该方法后,事件将被标记为“已使用”,同一帧内其他后续 GUI 控件将不再响应该事件。
- 常用于避免同一个鼠标点击被多个控件重复处理。
5. 静态方法
| 方法 | 说明 |
GetEventCount() |
返回事件队列中当前存储的事件数量。 |
PopEvent() |
从事件系统中获取并移除队列中的下一个 Event。通常由系统底层调用。 |
KeyboardEvent(string keyDescription) |
创建一个键盘事件,可用于模拟键盘输入(例如在测试中)。 |
6. 典型使用场景
UnityEngine.Event 主要用于早期 GUI 系统,例如:
- 在
OnGUI 中检测鼠标悬停或点击某个矩形区域:
- 处理键盘快捷键:
- 与
GUI.Window、GUILayout 等控件配合,实现复杂的自定义编辑器工具或调试界面。
7. 与 UnityEvent、EventSystem 的区别
- UnityEngine.Event:属于 IMGUI 系统,用于即时渲染的 GUI 事件。
- UnityEvent(位于
UnityEngine.Events 命名空间):是一个可序列化的委托容器,主要用于 UGUI 组件(Button、Slider 等)的回调绑定,可在 Inspector 中可视化配置。
- EventSystem(
UnityEngine.EventSystems):是 UGUI 的事件系统核心,负责射线检测、输入派发等,与 Event.current 不是一回事。
简单来说,UnityEngine.Event 是旧版 GUI 的事件类,用于在 OnGUI 里直接处理原始输入;而 UnityEvent 和 EventSystem 是新 UI 系统的回调机制和事件管理器。两者名称相似但用途截然不同,使用时需要根据目标 GUI 系统进行选择。