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

如何从MonoBehaviour访问Editor脚本?解决Reset配置丢失问题

从MonoBehaviour访问Editor脚本的可行性及重置时赋值解决方案

核心结论:无法直接从MonoBehaviour访问Editor脚本实例

Editor脚本属于UnityEditor命名空间,编译在仅编辑器环境生效的程序集中,而MonoBehaviour属于运行时程序集。直接引用Editor代码会导致编译错误,且打包后Editor代码会被完全剔除,因此不能直接从MonoBehaviour实例获取或调用对应的Editor脚本实例。

但针对你遇到的「重置MonoBehaviour时ScriptableObject被置空」的问题,有几种可行的替代方案:


方案1:在MonoBehaviour的Reset()中直接加载默认资源

在Reset方法里通过资源加载API直接获取默认的Gizmos配置,用#if UNITY_EDITOR包裹编辑器专属代码,避免打包报错:

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class YourMonoBehaviour : MonoBehaviour
{
    public GizmosConfiguration gizmosConfig;

    private void Reset()
    {
#if UNITY_EDITOR
        // 方式1:从指定路径加载(需完整Assets相对路径)
        gizmosConfig = AssetDatabase.LoadAssetAtPath<GizmosConfiguration>("Assets/Configs/DefaultGizmosConfig.asset");
        
        // 方式2:从Resources文件夹加载(资源需放在Resources目录下)
        // gizmosConfig = Resources.Load<GizmosConfiguration>("DefaultGizmosConfig");
        
        // 标记对象为脏,确保Unity保存修改
        EditorUtility.SetDirty(this);
#endif
    }
}

优缺点:

  • 优点:实现简单,无需额外Editor脚本配合
  • 缺点:资源路径固定,调整配置位置时需同步修改代码

方案2:通过Editor静态方法联动处理

在Editor脚本中编写静态赋值逻辑,然后在MonoBehaviour的Reset()中通过#if UNITY_EDITOR调用该静态方法,复用Editor侧的配置逻辑:

MonoBehaviour代码

using UnityEngine;

public class YourMonoBehaviour : MonoBehaviour
{
    public GizmosConfiguration gizmosConfig;

    private void Reset()
    {
#if UNITY_EDITOR
        YourMonoBehaviourEditor.SetDefaultGizmosConfig(this);
#endif
    }
}

Editor脚本代码

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(YourMonoBehaviour))]
public class YourMonoBehaviourEditor : Editor
{
    // 可在Inspector中设置默认配置模板
    public GizmosConfiguration defaultGizmosConfig;

    public static void SetDefaultGizmosConfig(YourMonoBehaviour target)
    {
        var editorInstance = CreateEditor(target) as YourMonoBehaviourEditor;
        if (editorInstance?.defaultGizmosConfig != null)
        {
            target.gizmosConfig = editorInstance.defaultGizmosConfig;
            EditorUtility.SetDirty(target);
        }
        DestroyImmediate(editorInstance);
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        
        // 显示默认配置设置字段
        defaultGizmosConfig = (GizmosConfiguration)EditorGUILayout.ObjectField(
            "默认Gizmos配置", 
            defaultGizmosConfig, 
            typeof(GizmosConfiguration), 
            false
        );

        // 手动触发赋值按钮
        if (GUILayout.Button("应用默认配置"))
        {
            SetDefaultGizmosConfig((YourMonoBehaviour)target);
        }
    }

    private void OnEnable()
    {
        // 选中对象时自动补全空引用
        var targetComp = (YourMonoBehaviour)target;
        if (targetComp.gizmosConfig == null && defaultGizmosConfig != null)
        {
            targetComp.gizmosConfig = defaultGizmosConfig;
            EditorUtility.SetDirty(targetComp);
        }
    }
}

优缺点:

  • 优点:可在Editor面板可视化配置默认模板,灵活性高,同时覆盖重置、选中对象两种场景的空引用问题
  • 缺点:需维护Editor脚本,代码量稍大

方案3:Editor脚本自动监听补全

无需修改MonoBehaviour的Reset方法,直接在Editor脚本中监听对象状态,当检测到gizmosConfig为空时自动赋值:

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(YourMonoBehaviour))]
public class YourMonoBehaviourEditor : Editor
{
    public GizmosConfiguration defaultGizmosConfig;

    private void OnEnable()
    {
        CheckAndAssignDefaultConfig();
    }

    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        defaultGizmosConfig = (GizmosConfiguration)EditorGUILayout.ObjectField("默认配置", defaultGizmosConfig, typeof(GizmosConfiguration), false);
        
        // 每次Inspector刷新时检查并补全
        CheckAndAssignDefaultConfig();
    }

    private void CheckAndAssignDefaultConfig()
    {
        var targetComp = (YourMonoBehaviour)target;
        if (targetComp.gizmosConfig == null && defaultGizmosConfig != null)
        {
            targetComp.gizmosConfig = defaultGizmosConfig;
            EditorUtility.SetDirty(targetComp);
        }
    }
}

优缺点:

  • 优点:无需修改MonoBehaviour代码,自动处理空引用
  • 缺点:仅在对象被选中、Inspector刷新时触发,无法实时响应所有重置场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 19:55:13