当前位置: 首页 > news >正文

【Unity】JSON数据的存取

这段代码的结构是为了实现 数据的封装和管理,特别是在 Unity 中保存和加载玩家数据时。以下是对代码设计的逐步解释:

1. PlayerCoin 类

PlayerCoin 是一个简单的数据类,用于表示单个玩家的硬币信息。它包含以下字段:

  • count:玩家拥有的硬币数量。

  • name:玩家的名字。

  • isWinner:表示玩家是否获胜。

  • [System.Serializable]:这个属性告诉 Unity 这个类可以被序列化(即将其数据转换为 JSON 或其他格式)。这是 Unity 中保存数据的必要步骤。

2. PlayerCoinList 类

PlayerCoinList 是一个容器类,用于管理多个 PlayerCoin 对象。它包含一个 List<PlayerCoin>,用于存储玩家数据。

  • List<PlayerCoin>:这是一个动态数组,可以存储任意数量的 PlayerCoin 对象。

  • [System.Serializable]:同样需要这个属性,因为 Unity 需要将整个 PlayerCoinList 对象序列化为 JSON。

3. DataSaveManager 类

DataSaveManager 是一个 Unity 的 MonoBehaviour,用于管理数据的保存和加载。它包含一个 PlayerCoinList 对象,用于存储和操作玩家数据。

  • MonoBehaviour:这是 Unity 中所有脚本的基类,允许脚本附加到游戏对象上。

  • PlayerCoinList list:这是一个实例化的 PlayerCoinList 对象,用于存储玩家数据。

为什么这样设计?

1. 数据封装
  • PlayerCoin:表示单个玩家的数据。

  • PlayerCoinList:表示多个玩家的数据集合。

  • DataSaveManager:负责管理这些数据的保存和加载。

这种分层设计的好处是:

  • 数据结构清晰,易于扩展。

  • 每个类都有明确的职责,代码更易于维护。

2. 序列化的需求

Unity 的 JsonUtility 类只能序列化带有 [System.Serializable] 属性的类。因此:

  • PlayerCoinPlayerCoinList 都需要标记为 [System.Serializable]

  • PlayerCoinList 是一个“根对象”,因为 JsonUtility 需要一个根对象来序列化整个数据结构。

3. Unity 的 JSON 限制

Unity 的 JsonUtility 不能直接序列化 List<T> 或数组,因此需要将 List<PlayerCoin> 包装在一个类(如 PlayerCoinList)中,作为序列化的根对象。

using UnityEngine;
using System.Collections.Generic;
using System.IO;[System.Serializable]
public class PlayerCoin
{public int count;public string name;public bool isWinner;
}[System.Serializable]
public class PlayerCoinList
{public List<PlayerCoin> playerCoinList = new List<PlayerCoin>();
}public class DataSaveManager : MonoBehaviour
{public PlayerCoinList list = new PlayerCoinList();void Start(){// 添加示例数据PlayerCoin player1 = new PlayerCoin();player1.count = 100;player1.name = "Player1";player1.isWinner = true;PlayerCoin player2 = new PlayerCoin();player2.count = 50;player2.name = "Player2";player2.isWinner = false;list.playerCoinList.Add(player1);list.playerCoinList.Add(player2);// 保存数据SaveData();// 加载数据LoadData();}void SaveData(){// 将对象序列化为 JSONstring json = JsonUtility.ToJson(list);// 将 JSON 数据写入文件string filePath = Application.persistentDataPath + "/playerData.json";File.WriteAllText(filePath, json);Debug.Log("Data saved to: " + filePath);}void LoadData(){string filePath = Application.persistentDataPath + "/playerData.json";// 检查文件是否存在if (File.Exists(filePath)){// 读取 JSON 数据string json = File.ReadAllText(filePath);// 反序列化 JSON 数据list = JsonUtility.FromJson<PlayerCoinList>(json);Debug.Log("Data loaded from: " + filePath);}else{Debug.Log("File not found: " + filePath);}}
}

相关文章:

  • hutool 工具类
  • 刷题 | 牛客 - js中等10题(更ing)1/54知识点解答
  • 【Python Cookbook】迭代器与生成器(一)
  • 【源码】30个Python小游戏
  • 总结【过往部分项目经历二(计算机图形学方向)】
  • 使用代理IP提取数据的步骤是什么?代理IP如何提高爬虫采集效率?
  • 计算机视觉与深度学习 | 基于YOLOv8与光流法的目标检测与跟踪(Python代码)
  • 十二种存储器综合对比——《器件手册--存储器》
  • 高处安装、维护、拆除作业证怎么考
  • 血脂代谢通路(医学-计算机系统对照方式)
  • 网络编程1
  • 工控系统前端设计(pyqt)
  • 机器学习期末
  • C# LINQ基础知识
  • 智能外呼赋能零售行业:效率、体验与增长的全面革新
  • GitLab CVE-2024-11129 安全漏洞解决方案
  • python绘制CPEFS人影区域模式预报产品图
  • 工业物联网的可视化编程革新:Node-RED与边缘计算的深度融合-纵横智控
  • Linux 上安装和配置 VNC 远程桌面
  • LangChain4j中的Chat与语言模型API详解:构建高效对话系统的利器
  • 乌方公布矿产协议详情:未提债务义务,包含美再援助条款
  • 神舟十九号载人飞行任务取得圆满成功
  • 民生访谈|规范放生活动、提升供水品质……上海将有这些举措
  • 新质观察|重塑低空经济的系统安全观
  • 监狱法修订草案提请全国人大常委会会议审议
  • 上海“生育友好岗”已让4000余人受益,今年将推产假社保补贴政策