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
相关产品推荐
相关产品推荐

