You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");
    }
}

注意事项

  1. 编辑器代码隔离:用#if UNITY_EDITOR包裹编辑器相关API,避免打包时出现编译错误。
  2. 边界场景测试:需覆盖以下场景验证逻辑正确性:
    • 编辑器非运行时,Inspector窗口内的自定义绘制
    • 编辑器运行时,GameView与Inspector窗口的同时绘制
    • 打包后的游戏运行时绘制
  3. SceneView适配:如果你的类需要支持SceneView内的绘制,可以在判断逻辑中单独处理SceneView类型,调整模式归属。

内容的提问来源于stack exchange,提问作者Onni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:07:59