【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] 属性的类。因此:
-
PlayerCoin和PlayerCoinList都需要标记为[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);}}
}相关文章:
【Unity】JSON数据的存取
这段代码的结构是为了实现 数据的封装和管理,特别是在 Unity 中保存和加载玩家数据时。以下是对代码设计的逐步解释: 1. PlayerCoin 类 PlayerCoin 是一个简单的数据类,用于表示单个玩家的硬币信息。它包含以下字段: count&…...
LeetCode【剑指offer】系列(位运算篇)
剑指offer15.二进制中1的个数 题目链接 题目:编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。 思路一ÿ…...
unity socket 客户端和c#服务器通信
服务器 using BarrageGrab; using System; using System.Collections.Concurrent; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading;namespace Lyx {class Server{private TcpListener listener;private Concurre…...
如何在Vue中实现取消聚焦el-select——从零到部署的完整指南
如何在Vue中实现取消聚焦el-select——从零到部署的完整指南 在开发Vue项目时,经常会遇到需要处理用户交互和组件状态管理的情况。特别是在使用Element UI组件库时,如何优雅地管理组件的状态显得尤为重要。本文将详细介绍如何在取消对话框时自动取消el-s…...
网络安全领域的AI战略准备:从概念到实践
网络安全领域的AI准备不仅涉及最新工具和技术的应用,更是一项战略必需。许多企业若因目标不明确、数据准备不足或与业务重点脱节而未能有效利用AI技术,可能面临严重后果,包括高级网络威胁数量的激增。 AI准备的核心要素 构建稳健的网络安全…...
《重构全球贸易体系用户指南》解读
文章目录 背景核心矛盾与理论框架美元的“特里芬难题”核心矛盾目标理论框架 政策工具箱的协同运作机制关税体系的精准打击汇率政策的混合干预安全工具的复合运用 实施路径与全球秩序重构阶段性目标 风险传导与反制效应内部失衡加剧外部反制升级系统性风险 范式突破与理论再思考…...
MacOs下解决远程终端内容复制并到本地粘贴板
常常需要在服务器上捣鼓东西,同时需要将内容复制到本地的需求。 1-内容是在远程终端用vim打开,如何用vim的类似指令达到快速复制到本地呢? 假设待复制的内容: #include <iostream> #include <cstring> using names…...
基于PAI+专属网关+私网连接:构建全链路 Deepseek 云上私有化部署与模型调用架构
DeepSeek - R1 是由深度求索公司推出的首款推理模型,该模型在数学、代码和推理任务上的表现优异,市场反馈火爆。在大模型技术商业化进程中,企业级用户普遍面临四大核心挑战: 算力投入成本高昂:构建千亿参数级模型的训…...
【cocos creator 3.x】cocos creator2.x项目升级3.x项目改动点
1、基本改动 基本改动:去掉了cc.,改成在顶部添加导入 项目升级时候直接将cc.去掉,根据提示添加引用 node只保留position,scale,rotation,layer 其余属性如opacity,如果需要使用需要在节点手动添加UIOpacity组件 3d层和ui层分开…...
eBay东南亚爆单密码:72小时交付计划如何重构厦门仓+东南亚供应链?
2024年东南亚电商市场规模预计突破2340亿美元,年复合增长率达18%。eBay最新战略将厦门纳入海外仓核心节点,推出“72小时交付计划”,通过“仓配转”一体化链路,助力中国卖家实现东南亚市场订单履约率提升10%,退货成本降…...
List基础与难度题
1. 向 ArrayList 中添加元素并打印 功能描述: 程序创建一个空的 ArrayList 集合,用于存储字符串类型的元素。向该 ArrayList 中依次添加指定的字符串元素。使用增强型 for 循环遍历 ArrayList 中的所有元素,并将每个元素打印输出到控制台。 …...
Oracle19C低版本一天遭遇两BUG(ORA-04031/ORA-600)
昨天帮朋友看一个系统异常卡顿的案例,在这里分享给大家 环境:Exadata X8M 数据库版本19.11 1.系统报错信息 表象为系统卡顿,页面无法刷出,登陆到主机上看到节点1 系统等待存在大量的 cursor: pin S wait on X等待 查看两个节…...
golang处理时间的包time一次性全面了解
本文旨在对官方time包有个全面学习了解。不钻抠细节,但又有全面了解,重点介绍常用的内容,一些低频的可能这辈子可能都用不上。主打一个花最少时间办最大事。 Duration对象: 两个time实例经过的时间,以长度为int64的纳秒来计数。 常见的durati…...
C++学习:六个月从基础到就业——面向对象编程:重载运算符(下)
C学习:六个月从基础到就业——面向对象编程:重载运算符(下) 本文是我C学习之旅系列的第十三篇技术文章,是面向对象编程中运算符重载主题的下篇。本篇文章将继续深入探讨高级运算符重载技术、特殊运算符、常见应用场景和…...
【网络安全】谁入侵了我的调制解调器?(二)
文章目录 针对 TR-069 协议 REST API 的攻击思路攻击百万台调制解调器意外发现 Cox 后端 API 的授权绕过漏洞确认我们能够进入任何人的设备访问和更新任何Cox商业客户账户通过泄露的加密密钥覆盖任何人的设备设置执行对任何调制解调器的命令影响最后想说阅读本文前,请先行浏览…...
【4.1.-4.20学习周报】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 摘要Abstract一、方法介绍1.1HippoRAG 1.2HippoRAG2二、实验2.1实验概况2.2实验代码2.3实验结果 总结 摘要 本博客介绍了论文《From RAG to Memory: Non-Parametri…...
MySQL 临时表介绍
在 MySQL 数据库中,临时表是一种特殊类型的表,它在数据库会话期间存在,会话结束时自动删除。临时表为处理特定的、临时性的数据操作任务提供了一种高效且便捷的方式。 一、临时表的创建 使用CREATE TEMPORARY TABLE语句来创建临时表。其语法…...
Rust : 关于*const () 与type erase
*const () 可以替代泛型,更加灵活。下面举了两个完全不一样的数据结构Foo和Bar;以及不同的函数,来说明。 一、 代码 trait Work {fn process(&self); } struct Foo(String);impl Work for Foo {fn process(&self) {println!("p…...
python学习—合并多个word文档
系列文章目录 python学习—合并TXT文本文件 python学习—统计嵌套文件夹内的文件数量并建立索引表格 python学习—查找指定目录下的指定类型文件 python学习—年会不能停,游戏抽签抽奖 python学习—循环语句-控制流 python学习—合并多个Excel工作簿表格文件 pytho…...
Java LinkedList深度解析:双向链表的实现艺术与实战指南
在Java集合框架中,LinkedList以其独特的双向链表结构和灵活的操作特性,成为处理动态数据的重要工具。本文将从底层实现、核心方法、性能优化到企业级应用场景,全方位解析这一经典数据结构的设计哲学与实战技巧。 一、LinkedList的设计定位与核心特性 1. 双向链表的本质 Lin…...
c#内存泄露的原因和解决办法
内存泄漏的原因 不正确的对象引用:最常见的原因是对象不再需要时未被垃圾回收器回收。例如,如果一个对象被一个不再使用的变量引用,它将不会被垃圾回收。事件订阅者未取消:如果订阅了一个事件但没有在对象不再需要时取消订阅&…...
android如何在生产环境中做到详实的日志收集而不影响性能?
在Android应用的生命周期中,日志收集贯穿于开发、测试到生产环境的每一个阶段。特别是在生产环境中,当应用部署到成千上万的用户设备上时,开发者无法直接访问用户的运行环境,也无法像在开发阶段那样通过调试工具实时查看代码执行情况。这时,日志就成为连接开发者与用户设备…...
MySQL安装实战:从零开始搭建你的数据库环境
MySQL作为全球最流行的开源关系型数据库,是开发者、运维人员及数据管理者的核心工具之一。本文将通过多平台安装指南、关键配置解析及常见问题排查三个维度,手把手带你完成MySQL环境搭建。 一、多平台安装指南 1. Linux系统(以Ubuntu为例&am…...
[Python] UV工具入门使用指南——小试牛刀
背景 MCP开发使用到了uv,简单记录一下: 为什么MCP更推荐使用uv进行环境管理? MCP 依赖的 Python 环境可能包含多个模块,uv 通过 pyproject.toml 提供更高效的管理方式,并且可以避免 pip 的一些依赖冲突问题。…...
PclSharp ——pcl的c#nuget包
简介: NuGet Gallery | PclSharp 1.8.1.20180820-beta07 下载.NET Framework 4.5.2 Developer Pack: 下载 .NET Framework 4.5.2 Developer Pack Offline Installer 离线安装nupkg: nupkg是visual studio 的NuGet Package的一个包文件 安…...
多任务响应1(Qt)
多任务响应1 1. 架构概述2. 代码示例3. 说明 当系统的一些任务都是同一个对象产生,但需要交由不同对象进行响应。 比如:系统有多个按键,这些按键的共用一个槽函数,但不同的按键对应不同的功能响应。 推荐采用命令模式分散响应的思…...
1. k8s的简介
Kubernetes(k8s)简介 1. 产生背景 随着云计算和微服务架构的兴起,传统的单体应用逐渐被拆分为多个小型、松耦合的服务(微服务)。这种架构虽然提升了开发灵活性和可维护性,但也带来了新的挑战:…...
单片机 | 基于51单片机的倾角测量系统设计
以下是一个基于51单片机的倾角测量系统设计详解,包含原理、公式和完整代码: 一、系统原理 核心器件:MPU6050(集成3轴加速度计+陀螺仪) 主控芯片:STC89C52RC(51单片机) 显示模块:LCD1602液晶 工作原理: 通过MPU6050采集XYZ三轴加速度数据,利用重力加速度分量计算俯仰…...
div(HTML标准元素)和view(微信小程序专用组件)的主要区别体
div(HTML标准元素)和view(微信小程序专用组件)的主要区别体现在以下方面: 一、应用场景与开发框架 适用平台不同 div是HTML/CSS开发中通用的块级元素,用于Web页面布局;view是微信小程序专…...
MGR实现mysql高可用性
一。MGR和PXC的区别 1. PXC的消息广播机制是在节点间循环的,需要所有节点都确认消息,因此只要有一个节点故障,则会导致整个PXC都发生故障。而MGR则是多数派投票模式,个别少数派节点故障时,一般不影响整体的可用性。这…...
