对Event.current.type介绍
·
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;
}
}
⚠️ 关键注意事项
-
事件消耗:
Event.current.Use(); // 标记事件已处理- 防止事件被其他 GUI 元素处理
- 必须在处理完事件后调用
-
事件优先级:
- Unity 按特定顺序处理事件
- 先处理
Layout和Repaint,然后是交互事件
-
鼠标位置获取:
Vector2 mousePos = Event.current.mousePosition;- 坐标基于当前 GUI 区域
-
键盘事件处理:
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();
}
}
💡 最佳实践
-
精确过滤事件:
// 只在特定区域处理事件 if (myRect.Contains(Event.current.mousePosition)) { // 处理事件... } -
组合键检测:
bool isShift = (Event.current.modifiers & EventModifiers.Shift) != 0; -
事件传播控制:
// 允许事件继续传播 if (shouldPropagateEvent) return; Event.current.Use(); // 阻止事件传播 -
性能优化:
// 只在需要时处理事件 if (Event.current.type == EventType.Repaint) { DrawCustomElements(); }
Event.current.type 是 Unity 编辑器扩展开发中事件处理的核心机制,掌握它能够创建高度交互式的编辑器工具。
更多推荐



所有评论(0)