Unity技术问询:能否将Inspector序列化数据保存回脚本?
能否将Unity Inspector中的序列化数据保存回脚本文件?
默认情况下,Unity不会自动将Inspector中修改的序列化数据写回你的C#脚本文件。原因很直接:你脚本里的items数组是硬编码的源代码,Unity的序列化系统只会把Inspector中修改的数据存储在场景文件(.unity)、预制体文件(.prefab)或相关资产元文件里,不会直接修改你的C#源文件。
为什么不建议写回脚本?
脚本属于项目的源代码,硬编码数据会带来诸多问题:
- 数据修改需要重新编译代码,效率极低
- 版本控制时,数据变更会和代码变更混在一起,难以追溯
- 容易误改脚本中的其他逻辑代码
更合理的替代方案
1. 使用ScriptableObject存储数据
这是Unity管理配置数据的标准方式,数据会存在独立的.asset文件中,和脚本完全分离:
[System.Serializable] public class Item { public string name; public ItemType type; public string description; public Item(string name, ItemType type, string description) { this.name = name; this.type = type; this.description = description; } } public enum ItemType { Weapon, Consumable } [CreateAssetMenu(fileName = "NewItemDatabase", menuName = "Databases/Item Database")] [System.Serializable] public class ItemDatabase : ScriptableObject { public Item[] items; }
使用步骤:
- 在Project窗口右键 →
Databases/Item Database创建资产文件 - 选中该资产,在Inspector中编辑
items数组 - 修改后直接保存,数据会存在这个
.asset文件里,无需修改脚本
2. 导出为外部配置文件
可以自己写编辑器工具,将Inspector中的数据导出为JSON、XML等格式的配置文件,运行时再加载:
// 放在Editor文件夹下的编辑器工具示例 using UnityEditor; using UnityEngine; using System.IO; [CustomEditor(typeof(ItemDatabase))] public class ItemDatabaseEditor : Editor { public override void OnInspectorGUI() { DrawDefaultInspector(); ItemDatabase db = (ItemDatabase)target; if (GUILayout.Button("导出为JSON")) { string json = JsonUtility.ToJson(db, prettyPrint: true); string path = EditorUtility.SaveFilePanel("保存物品数据库", Application.dataPath, "ItemDatabase", "json"); if (!string.IsNullOrEmpty(path)) { File.WriteAllText(path, json); AssetDatabase.Refresh(); } } } }
3. 手动编写编辑器工具修改脚本(不推荐)
如果一定要将数据写回脚本,需要自己实现代码生成逻辑,比如用Roslyn API解析和修改C#文件。简化思路如下:
- 获取
ItemDatabase组件中的items数据 - 将数据转换为C#数组初始化的字符串格式
- 定位到脚本文件中
items数组的代码段 - 替换原有代码并写入文件
这种方式需要处理大量细节(比如字符串转义、枚举值匹配、代码格式保持),且容易破坏脚本结构,除非特殊需求不建议使用。
内容的提问来源于stack exchange,提问作者Sid Chou
相关产品推荐
相关产品推荐

