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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:07:46