unity Event 详解

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 枚举),如 KeyDownMouseDownRepaintLayout等。
commandName 当类型为 ExecuteCommand 或 ValidateCommand 时的命令名称。
displayIndex 事件所属显示器的索引(多显示器环境下有用)。

4. 常用公共方法

GetTypeForControl(int id)

  • 获取针对特定控件 ID 过滤后的事件类型。
  • 用于判断某个控件是否获得焦点或应采取何种响应。

Use()

  • 调用该方法后,事件将被标记为“已使用”,同一帧内其他后续 GUI 控件将不再响应该事件。
  • 常用于避免同一个鼠标点击被多个控件重复处理。

5. 静态方法

方法说明
GetEventCount() 返回事件队列中当前存储的事件数量。
PopEvent() 从事件系统中获取并移除队列中的下一个 Event。通常由系统底层调用。
KeyboardEvent(string keyDescription) 创建一个键盘事件,可用于模拟键盘输入(例如在测试中)。

6. 典型使用场景

UnityEngine.Event 主要用于早期 GUI 系统,例如:

  • 在 OnGUI 中检测鼠标悬停或点击某个矩形区域:
    void OnGUI() {
        Event e = Event.current;
        Rect buttonRect = new Rect(10, 10, 100, 30);
        if (e.type == EventType.MouseDown && buttonRect.Contains(e.mousePosition)) {
            Debug.Log("Button clicked");
            e.Use(); // 防止同一事件被重复消费
        }
    }
  • 处理键盘快捷键:
    void OnGUI() {
        Event e = Event.current;
        if (e.isKey && e.keyCode == KeyCode.Space && e.type == EventType.KeyDown) {
            Debug.Log("Space pressed");
            e.Use();
        }
    }
  • 与 GUI.WindowGUILayout 等控件配合,实现复杂的自定义编辑器工具或调试界面。

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 系统进行选择。

posted on 2026-05-18 16:59  -冷夜-  阅读(27)  评论(0)    收藏  举报

导航