Event.current.type 是 Unity 编辑器 GUI 系统中用于识别当前事件类型的关键属性。它属于 UnityEngine.EventType 枚举类型,用于判断当前正在处理的事件种类。以下是详细解释:


概念

  • Event.current:Unity 编辑器中的全局静态对象,表示当前正在处理的 GUI 事件
  • .type:该事件的类型(如鼠标点击、键盘输入、拖拽操作等)
  • 使用场景:主要在 OnGUI()OnInspectorGUI() 等编辑器扩展方法中

📋 常见事件类型及用途

事件类型触发时机应用场景
EventType.MouseDown鼠标按下时检测按钮点击
EventType.MouseUp鼠标释放时完成拖拽操作
EventType.MouseMove鼠标移动时实现拖拽效果
EventType.MouseDrag鼠标拖拽时对象拖拽操作
EventType.KeyDown按键按下时快捷键处理
EventType.Repaint界面重绘时每帧自动触发
EventType.Layout布局计算时自动布局系统
EventType.DragUpdated拖拽对象经过 GUI 元素时更新拖拽视觉效果
EventType.DragPerform拖拽对象在 GUI 元素上释放时处理拖拽的资源
EventType.DragExited拖拽对象离开 GUI 元素时清理拖拽状态
EventType.ContextClick右键点击时弹出上下文菜单
EventType.Used事件已被处理防止事件二次处理

🔍 在代码中的典型用法

void OnInspectorGUI()
{
    // 获取当前事件
    Event currentEvent = Event.current;
    
    // 根据事件类型执行不同操作
    switch (currentEvent.type)
    {
        case EventType.MouseDown:
            Debug.Log("鼠标按下位置: " + currentEvent.mousePosition);
            break;
            
        case EventType.KeyDown:
            if (currentEvent.keyCode == KeyCode.Space)
                Debug.Log("空格键被按下");
            break;
            
        case EventType.DragUpdated:
            // 检查拖拽内容是否有效
            bool isValid = DragAndDrop.objectReferences.Length > 0;
            DragAndDrop.visualMode = isValid 
                ? DragAndDropVisualMode.Copy 
                : DragAndDropVisualMode.Rejected;
            currentEvent.Use(); // 标记事件已处理
            break;
            
        case EventType.DragPerform:
            // 处理拖拽的资源
            foreach (var obj in DragAndDrop.objectReferences)
            {
                Debug.Log("拖拽对象: " + obj.name);
            }
            currentEvent.Use(); // 标记事件已处理
            break;
            
        case EventType.Repaint:
            // 每帧重绘时执行
            break;
    }
}

⚠️ 关键注意事项

  1. 事件消耗

    Event.current.Use(); // 标记事件已处理
    
    • 防止事件被其他 GUI 元素处理
    • 必须在处理完事件后调用
  2. 事件优先级

    • Unity 按特定顺序处理事件
    • 先处理 LayoutRepaint,然后是交互事件
  3. 鼠标位置获取

    Vector2 mousePos = Event.current.mousePosition;
    
    • 坐标基于当前 GUI 区域
  4. 键盘事件处理

    if (Event.current.keyCode == KeyCode.Return)
    {
        // 回车键处理
    }
    

🌰 实际应用案例

1. 拖拽资源接收器
Rect dropArea = new Rect(10, 10, 200, 50);

if (Event.current.type == EventType.DragUpdated && 
    dropArea.Contains(Event.current.mousePosition))
{
    // 检查是否是纹理
    bool isTexture = DragAndDrop.objectReferences
        .Any(obj => obj is Texture2D);
    
    // 设置拖拽图标
    DragAndDrop.visualMode = isTexture 
        ? DragAndDropVisualMode.Copy 
        : DragAndDropVisualMode.Rejected;
    
    Event.current.Use();
}

if (Event.current.type == EventType.DragPerform && 
    dropArea.Contains(Event.current.mousePosition))
{
    // 获取所有拖拽的纹理
    var textures = DragAndDrop.objectReferences
        .OfType<Texture2D>();
    
    foreach (var tex in textures)
    {
        AddTextureToDatabase(tex);
    }
    
    Event.current.Use();
}
2. 快捷键处理
if (Event.current.type == EventType.KeyDown)
{
    // Ctrl+S 保存
    if (Event.current.control && Event.current.keyCode == KeyCode.S)
    {
        SaveProject();
        Event.current.Use();
    }
    
    // F5 刷新
    if (Event.current.keyCode == KeyCode.F5)
    {
        RefreshData();
        Event.current.Use();
    }
}

💡 最佳实践

  1. 精确过滤事件

    // 只在特定区域处理事件
    if (myRect.Contains(Event.current.mousePosition))
    {
        // 处理事件...
    }
    
  2. 组合键检测

    bool isShift = (Event.current.modifiers & EventModifiers.Shift) != 0;
    
  3. 事件传播控制

    // 允许事件继续传播
    if (shouldPropagateEvent)
        return;
    
    Event.current.Use(); // 阻止事件传播
    
  4. 性能优化

    // 只在需要时处理事件
    if (Event.current.type == EventType.Repaint)
    {
        DrawCustomElements();
    }
    

Event.current.type 是 Unity 编辑器扩展开发中事件处理的核心机制,掌握它能够创建高度交互式的编辑器工具。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐