Unity中Team对象实例的加载功能实现求助(已完成保存)
Unity存档加载解决方案
核心思路
加载时需先清理场景内默认的预制体团队实例,再读取存档文件反序列化为Team数据列表,最后逐个实例化预制体并将保存的属性值赋值给新实例。
具体实现步骤
读取并反序列化存档数据
通过StreamReader读取存档文件,再用JsonConvert.DeserializeObject将JSON字符串转换为List<Team>数据集合:public List<Team> LoadTeamData() { string savePath = Path.Combine(Application.persistentDataPath, "save.json"); if (!File.Exists(savePath)) return new List<Team>(); StreamReader sr = new StreamReader(savePath); string json = sr.ReadToEnd(); sr.Close(); return JsonConvert.DeserializeObject<List<Team>>(json, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); }清理现有团队实例
给所有Team实例添加统一标签(比如TeamInstance),加载前批量查找并销毁,避免重复显示:private void ClearExistingTeams() { GameObject[] existingTeams = GameObject.FindGameObjectsWithTag("TeamInstance"); foreach (var teamObj in existingTeams) { Destroy(teamObj); } }实例化预制体并赋值属性
遍历反序列化得到的Team数据,实例化预制体后将保存的属性值逐一赋值给新实例:public void LoadTeams(GameObject teamPrefab) { ClearExistingTeams(); List<Team> savedTeams = LoadTeamData(); foreach (var savedTeam in savedTeams) { GameObject newTeamObj = Instantiate(teamPrefab); newTeamObj.tag = "TeamInstance"; Team newTeam = newTeamObj.GetComponent<Team>(); // 赋值需恢复的属性 newTeam.health = savedTeam.health; newTeam.mana = savedTeam.mana; newTeam.exp = savedTeam.exp; // 其他自定义属性同理赋值 } }
关键注意点
- 确保Team类中需要序列化的字段为
public或添加[SerializeField]标签,否则JSON序列化/反序列化会忽略这些字段。 - 替换硬编码的存档路径为
Application.persistentDataPath,适配不同平台的文件系统规则。 - 若Team类包含引用类型成员,需保持序列化时的
ReferenceLoopHandling.Ignore配置,避免反序列化出错。
内容的提问来源于stack exchange,提问作者Nowko
相关产品推荐
相关产品推荐

