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

如何将存储角色数据的JSON解析后生成Unity GameObject

问题解决方案

问题1 解决:CharacterData不需要继承MonoBehaviour

CharacterData作为纯数据承载类,本身不需要继承MonoBehaviour,也不需要挂载到游戏对象上。如果需要在Inspector面板可视化查看/调试解析结果,只需要另外写一个继承MonoBehaviour的管理类,在管理类中声明public List<CharacterData> characterList;,再将管理类挂载到场景对象上即可。强行让数据类继承MonoBehaviour反而会导致JsonUtility序列化/反序列化失败。

问题2 解析JSON的实现步骤

第一步 确认完整JSON结构

你给出的JSON片段不完整,标准可解析结构如下(外层包裹对象,包含Items数组):

{
  "Items": [
    {
      "characterName": "No Name Assigned",
      "chararacterCampaign": "No Campaign Assigned",
      "chararacterJob": "No job Assigned",
      "chararacterTown": "No town Assigned",
      "chararacterRace": "No race Assigned",
      "chararacterSkin": "No skin Assigned",
      "chararacterEyes": "No eyes Assigned",
      "chararacterHair": "No hair Assigned",
      "chararacterAge": "No age Assigned",
      "chararacterBuild": "No build Assigned",
      "chararacterPitch": "no value",
      "chararacterTexture": "no value",
      "chararacterNasality": "no value",
      "chararacterEnunciation": "no value",
      "chararacterTonalRange": "no value",
      "chararacterSpeed": "no value",
      "chararacterVolume": "no value",
      "chararacterAccent": "No accent Assigned"
    }
  ]
}

第二步 修正数据类字段匹配JSON键名

Unity自带的JsonUtility要求C#类字段名与JSON键名完全一致才能正确解析,修正后的CharacterData如下:

[System.Serializable]
public class CharacterData
{
    // 字段名与JSON键名完全匹配,你JSON中字段存在拼写冗余(chararacter多了一个r),保持一致即可
    public string characterName;
    public string chararacterCampaign;
    public string chararacterJob;
    public string chararacterTown;
    public string chararacterRace;
    public string chararacterSkin;
    public string chararacterEyes;
    public string chararacterHair;
    public string chararacterAge;
    public string chararacterBuild;
    public string chararacterPitch;
    public string chararacterTexture;
    public string chararacterNasality;
    public string chararacterEnunciation;
    public string chararacterTonalRange;
    public string chararacterSpeed;
    public string chararacterVolume;
    public string chararacterAccent;
}

第三步 新增JSON包裹类

Unity的JsonUtility不支持直接解析根节点为数组的JSON,因此需要新增外层包裹类对应JSON的外层结构:

[System.Serializable]
public class CharacterDataWrapper
{
    public List<CharacterData> Items;
    
    public static CharacterDataWrapper CreateFromJSON(string jsonString)
    {
        return JsonUtility.FromJson<CharacterDataWrapper>(jsonString);
    }
}

第四步 实现数据读取管理类

新增继承MonoBehaviour的管理类,用于读取JSON文件、解析并存储为可操作的列表,该类可直接挂载到场景对象上:

using System.IO;
using UnityEngine;

public class CharacterDataManager : MonoBehaviour
{
    // 解析完成的角色数据列表会直接显示在Inspector面板中
    public List<CharacterData> characterList;

    void Start()
    {
        LoadCharacterData();
    }

    public void LoadCharacterData()
    {
        // 替换为你的JSON文件实际存储路径,示例为StreamingAssets目录下的characters.json
        string jsonPath = Path.Combine(Application.streamingAssetsPath, "characters.json");
        if (File.Exists(jsonPath))
        {
            string jsonContent = File.ReadAllText(jsonPath);
            CharacterDataWrapper wrapper = CharacterDataWrapper.CreateFromJSON(jsonContent);
            characterList = wrapper.Items;
            // 此时characterList已经是可直接操作的列表,可直接用于实例化填充prefab
        }
        else
        {
            Debug.LogError("JSON文件未找到,路径:" + jsonPath);
        }
    }
}

额外注意事项

  • 可后续统一修正JSON和C#字段的拼写错误(将冗余的r删除,统一为character),降低后续维护成本
  • 所有需要被JsonUtility解析的类必须添加[System.Serializable]标签
  • 如果你的JSON文件存储在Resources目录下,可改用Resources.Load<TextAsset>("文件名").text读取JSON内容

内容的提问来源于stack exchange,提问作者Brian Wiggins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:27:03