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

Unity自定义工具开发:Editor脚本如何引用并修改ScriptableObject数据

Unity Editor脚本获取ScriptableObject引用的实现方法

根据不同的使用场景,选下面任意一种方式即可:

  • 暴露字段手动选择/拖拽赋值
    这是最灵活也最不容易出错的方式,直接在你的Editor工具脚本里声明对应类型的字段,用EditorGUILayout.ObjectField绘制选择槽,既可以把项目里的ScriptableObject资产拖进去赋值,也可以点击槽位旁边的小圆圈选资产。
    示例代码:
using UnityEditor;
using UnityEngine;

public class DataEditTool : EditorWindow
{
    private MyGameConfigSO _targetConfig;

    [MenuItem("Tools/游戏配置编辑器")]
    static void OpenTool()
    {
        GetWindow<DataEditTool>("配置编辑器");
    }

    private void OnGUI()
    {
        // 绘制资产选择栏
        _targetConfig = (MyGameConfigSO)EditorGUILayout.ObjectField(
            "待编辑配置", 
            _targetConfig, 
            typeof(MyGameConfigSO), 
            false // 传false表示允许选项目里的资产,传true只能选场景里的对象
        );

        if (_targetConfig == null)
        {
            EditorGUILayout.HelpBox("请先指定要编辑的ScriptableObject资产", MessageType.Warning);
            return;
        }
        
        // 后续直接操作_targetConfig即可完成数据读写编辑
    }
}
  • 固定路径直接加载
    如果你的ScriptableObject资产存放在项目里的固定路径,不需要用户手动选,可以直接用AssetDatabase的接口按路径加载,不需要手动操作界面赋值。
    示例代码:
// 路径要写从Assets根目录开始的完整相对路径,必须带上.asset后缀
_targetConfig = AssetDatabase.LoadAssetAtPath<MyGameConfigSO>("Assets/GameRes/Configs/MainConfig.asset");
  • 全局搜索匹配资产
    如果资产路径不固定,需要工具自动查找项目里对应类型的ScriptableObject,可以用资产筛选接口搜索:
// 搜索所有MyGameConfigSO类型的资产,返回的是资产GUID列表
string[] assetGuids = AssetDatabase.FindAssets("t:MyGameConfigSO");
if (assetGuids.Length > 0)
{
    string assetPath = AssetDatabase.GUIDToAssetPath(assetGuids[0]);
    _targetConfig = AssetDatabase.LoadAssetAtPath<MyGameConfigSO>(assetPath);
}

注意:所有涉及UnityEditor命名空间的代码,必须放在项目中名为Editor的文件夹下,或者用#if UNITY_EDITOR宏包裹,否则打正式包时会报编译错误。编辑完ScriptableObject的数据后,记得调用EditorUtility.SetDirty(_targetConfig)标记对象已修改,否则修改内容不会被Unity保存到本地资产。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:15:26