Unity如何自动检测当前IMGUI绘制目标(屏幕/编辑器窗口)?
可行,以下是实现方案
完全可以实现自动检测当前GUIMode的功能,核心思路是利用Unity的运行时/编辑器API判断当前的绘制上下文,无需手动指定模式。
核心判断逻辑
区分两种模式的关键在于识别当前代码的执行环境(运行时/编辑器)以及绘制所在的窗口类型:
- Screen模式:对应游戏运行时的GameView、编辑器编辑状态下的GameView/SceneView
- Inspector模式:对应编辑器的Inspector窗口、自定义EditorWindow
实现代码
下面是一个可直接复用的检测工具类,包含完整的判断逻辑:
using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif public enum GUIMode { Screen, Inspector } public static class GUIModeDetector { public static GUIMode GetCurrentGUIMode() { #if UNITY_EDITOR // 获取当前聚焦的编辑器窗口 var activeWindow = EditorWindow.focusedWindow; if (activeWindow != null) { // 判断是否为Inspector窗口(Unity内部类,通过类名识别) if (activeWindow.GetType().Name == "InspectorWindow") { return GUIMode.Inspector; } // 判断是否为自定义EditorWindow(排除SceneView/GameView) if (!(activeWindow is SceneView) && !(activeWindow is GameView)) { return GUIMode.Inspector; } } #endif // 其他所有情况(运行时GameView、SceneView、非编辑器环境)都归为Screen模式 return GUIMode.Screen; } }
使用方式
在你的GUI绘制类中,只需在绘制逻辑前调用检测方法即可自动切换模式:
public void OnGUI() { var currentMode = GUIModeDetector.GetCurrentGUIMode(); if (currentMode == GUIMode.Screen) { // 执行游戏内Screen模式的绘制逻辑 GUI.Label(new Rect(10,10,200,30), "Screen Mode"); } else { // 执行Inspector模式的绘制逻辑 EditorGUILayout.LabelField("Inspector Mode"); } }
注意事项
- 编辑器代码隔离:用
#if UNITY_EDITOR包裹编辑器相关API,避免打包时出现编译错误。 - 边界场景测试:需覆盖以下场景验证逻辑正确性:
- 编辑器非运行时,Inspector窗口内的自定义绘制
- 编辑器运行时,GameView与Inspector窗口的同时绘制
- 打包后的游戏运行时绘制
- SceneView适配:如果你的类需要支持SceneView内的绘制,可以在判断逻辑中单独处理
SceneView类型,调整模式归属。
内容的提问来源于stack exchange,提问作者Onni
相关产品推荐
相关产品推荐

