如何将存储角色数据的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
相关产品推荐
相关产品推荐

