Unity中如何将含Sprite路径的JSON转为加载资源的ScriptableObject
问题:将包含Sprite资源路径的JSON转换为Unity ScriptableObject
问题相关代码与定义
JSON 数据
[ { "name": "Generic Ability", "icon": "Assets/Database/Images/default.png" }, { "name": "Another Ability", "icon": "Assets/Database/Images/another.png" } ]
Ability 类定义
[System.Serializable] public class Ability { public string abilityName; public Sprite icon; }
AbilityDatabase ScriptableObject 定义
using UnityEngine; using System.Collections.Generic; [CreateAssetMenu(fileName = "AbilityDatabase", menuName = "Ability Database", order = 2)] public class AbilityDatabase : ScriptableObject { public List<Ability> abilities; }
当前现状
我有一个存储Sprite资源文件路径键值对的JSON文件。
目标
将该JSON转换为C# ScriptableObject,自动从路径加载对应的Sprite资源,而非保留字符串路径。
遇到的问题
编写JSON转ScriptableObject的代码时受阻,已尝试两种方案:
- 使用Unity的Json.net:
JsonConvert.DeserializeObject无法处理资源引用; - 使用Odin的Serializer:要求JSON格式严格匹配,难以适配现有数据。
希望获取示例实现,不限框架,完成从含资源路径的JSON到加载对应Sprite的ScriptableObject的转换。
解决方案示例
核心思路是用中间类接收JSON中的字符串路径,再通过Unity编辑器API加载Sprite,最终填充到ScriptableObject中。以下是完整的编辑器工具实现:
1. 定义JSON解析用的中间类
[System.Serializable] public class AbilityJsonData { public string name; public string icon; }
2. 编辑器转换工具代码
using UnityEngine; using UnityEditor; using System.IO; using System.Collections.Generic; using Newtonsoft.Json; public static class AbilityJsonToScriptableObject { [MenuItem("Tools/Convert Ability JSON to ScriptableObject")] public static void ConvertJsonToDatabase() { // 替换为你的JSON文件实际路径 string jsonPath = Application.dataPath + "/Database/Abilities.json"; if (!File.Exists(jsonPath)) { Debug.LogError("JSON文件不存在:" + jsonPath); return; } string jsonContent = File.ReadAllText(jsonPath); // 反序列化为中间数据结构 List<AbilityJsonData> jsonAbilities = JsonConvert.DeserializeObject<List<AbilityJsonData>>(jsonContent); // 创建ScriptableObject实例 AbilityDatabase abilityDatabase = ScriptableObject.CreateInstance<AbilityDatabase>(); abilityDatabase.abilities = new List<Ability>(); // 遍历加载Sprite并填充数据 foreach (var jsonAbility in jsonAbilities) { Ability newAbility = new Ability(); newAbility.abilityName = jsonAbility.name; // 编辑器环境下通过路径加载Sprite Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>(jsonAbility.icon); if (sprite == null) { Debug.LogWarning($"无法加载Sprite:{jsonAbility.icon}"); continue; } newAbility.icon = sprite; abilityDatabase.abilities.Add(newAbility); } // 保存ScriptableObject到指定路径 string savePath = "Assets/Database/AbilityDatabase.asset"; AssetDatabase.CreateAsset(abilityDatabase, savePath); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.Log("转换完成,已生成ScriptableObject:" + savePath); } }
实现说明
- 该工具仅在Unity编辑器环境下运行,
AssetDatabase属于编辑器API,打包后无法使用; - 若需运行时加载,可改用
Resources.Load(要求Sprite放在Resources文件夹下)或Unity Addressables; - 使用Newtonsoft.Json需先在Unity Package Manager中安装
com.unity.nuget.newtonsoft-json包; - 转换操作可通过Unity顶部菜单
Tools/Convert Ability JSON to ScriptableObject触发。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

