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

如何实现可在Unity Inspector中修改的静态嵌套类?

Unity 静态嵌套类在Inspector中编辑的可行方案

Unity的Inspector默认只支持编辑实例对象的非静态成员,你的静态类结构无法直接作为组件挂载——因为组件需要继承MonoBehaviour,且静态成员不会被Inspector序列化显示。以下是几种实用的解决思路:

方案1:非静态嵌套类 + 单例MonoBehaviour容器

把静态嵌套类改成非静态可序列化类,用一个单例脚本作为全局容器挂载到GameObject上,既能在Inspector编辑,又能全局调用。

修改后的代码示例:

using UnityEngine;

// 定义可序列化的参数类,包含嵌套分组
[System.Serializable]
public class Parameters
{
    [System.Serializable]
    public class GroupA
    {
        public float varA = 1f;
    }
    
    [System.Serializable]
    public class GroupB
    {
        public float varB = 2f;
    }

    // 初始化分组实例
    public GroupA groupA = new GroupA();
    public GroupB groupB = new GroupB();
}

// 全局单例容器,挂载到任意GameObject(比如空物体Settings)
public class SettingsManager : MonoBehaviour
{
    public static SettingsManager Instance { get; private set; }
    public Parameters parameters;

    void Awake()
    {
        // 单例逻辑,确保全局唯一且不随场景销毁
        if (Instance == null)
        {
            Instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
}

使用方式:在Inspector里给SettingsManager的parameters赋值(或直接编辑默认值),代码中通过SettingsManager.Instance.parameters.groupA.varA调用。

优点:实现简单,无需额外Editor代码;缺点:依赖场景中的GameObject,打包前需确保该对象存在。

方案2:ScriptableObject 配置文件

用ScriptableObject存储参数,无需挂载到GameObject,直接生成配置资产文件,修改后自动保存,适合全局共享的配置。

代码示例:

using UnityEngine;

// 右键菜单生成配置文件
[CreateAssetMenu(fileName = "GameParameters", menuName = "Settings/Game Parameters")]
public class GameParameters : ScriptableObject
{
    [System.Serializable]
    public class GroupA
    {
        public float varA = 1f;
    }
    
    [System.Serializable]
    public class GroupB
    {
        public float varB = 2f;
    }

    public GroupA groupA = new GroupA();
    public GroupB groupB = new GroupB();
}

使用方式:右键Create > Settings > Game Parameters生成配置文件,在Inspector中编辑;代码中可以通过Resources.Load<GameParameters>("GameParameters")加载,或者直接在其他脚本中引用该配置资产。

优点:独立于场景,配置可复用,修改持久化;缺点:需要通过资源加载或直接引用访问,适合不频繁修改的全局参数。

方案3:自定义Editor窗口编辑静态变量

如果不想修改原有静态类结构,可以写一个自定义Editor窗口,手动绘制静态变量的编辑界面。

代码示例:

using UnityEditor;
using UnityEngine;

public class ParametersEditorWindow : EditorWindow
{
    // 顶部菜单打开窗口
    [MenuItem("Window/Parameters Editor")]
    public static void ShowWindow()
    {
        GetWindow<ParametersEditorWindow>("参数编辑器");
    }

    void OnGUI()
    {
        // 绘制静态变量的编辑字段
        Parameters.GroupA.varA = EditorGUILayout.FloatField("变量A", Parameters.GroupA.varA);
        Parameters.GroupB.varB = EditorGUILayout.FloatField("变量B", Parameters.GroupB.varB);

        // 标记修改,确保编辑器识别变更
        if (GUI.changed)
        {
            EditorUtility.SetDirty(this);
        }
    }
}

使用方式:打开Window > 参数编辑器即可编辑静态变量,注意Play模式下修改的静态值会在停止Play后重置,如果需要持久化,需额外添加保存/加载逻辑(比如写入本地文件)。

优点:保留原有静态类结构;缺点:需要编写Editor代码,Play模式修改不持久。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:25:23