Unity笔记:数据持久化的几种方式

正文

主要方法:

  • ScriptableObject
  • PlayerPrefs
  • JSON
  • XML
  • 数据库(如Sqlite)

1. PlayerPerfs

PlayerPrefs 存储的数据是全局共享的,它们存储在用户设备的本地存储中,并且可以被应用程序的所有部分访问。这意味着,无论在哪个场景、哪个脚本中,只要是同一个应用程序中的代码,都可以读取和修改 PlayerPrefs 中的数据。

这意味着耦合性的增加、安全性的降低。它适合存储少量的基本数据(比如玩家的偏好设置、游戏设置、游戏进度等),但不适合存储大量或复杂的数据结构。

注意:

  • 每次Set完数据要调用PlayerPrefs.Save()把数据写入磁盘。
  • Get有两个参数,第一个是键名,第二个是没找到时传入的默认值。
int highScore = 1000;
PlayerPrefs.SetInt("HighScore", highScore);
// 记得保存
PlayerPrefs.Save();// 没找到就返回3
int score = PlayerPrefs.GetInt("Score", 3);

2. ScriptableObject

ScriptableObject的值在播放模式之后不会恢复原样,会保留修改

可以用于只读和读写两种数据,不过原则上还是只用于只读数据。

ScriptableObject 并不依赖于游戏对象(GameObject),也不受场景加载和卸载的影响。它的生命周期是由 Unity 引擎管理的。

使用流程:

  1. 派生自ScriptableObject创建基类
  2. 实例化后由编辑器对实例进行配置
  3. 其他C#脚本使用某个实例
  4. 合理使用OnValidate()方法(这是ScriptableObject中的值更改时触发的事件,但是仅限在编辑器使用

下述代码在数值发生变化时触发定义的valueChanged事件。注意需要在其他脚本中向 valueChanged 事件添加侦听器才能响应

// 代码源自参考链接2
using UnityEngine;
using UnityEngine.Events;[CreateAssetMenu(fileName = "NewWeapon", menuName = "Game/Weapon")]
public class WeaponScriptableObject : ScriptableObject
{public string weaponName;public int damage;public Sprite icon;[SerializeField, Range(0, 100)]private int maxHealth;// Define a UnityEvent with no argumentspublic UnityEvent valueChanged;#if UNITY_EDITORprivate void OnValidate(){// This method is called in the Unity Editor whenever a value is changed.// Invoke the UnityEvent when values change.if (UnityEditor.EditorApplication.isPlaying){valueChanged.Invoke(); // Fire the UnityEvent}}
#endif
}

这里要注意的是类似于[CreateAssetMenu(fileName = "mySharedData", menuName = "SharedData/MySharedData", order = 1)]这样的东西,意思是:

  • fileName:新创建实例的默认文件名为"mySharedData"。
  • menuName:在“Assets/Create”菜单中显示的类型条目名称为"SharedData"下的"MySharedData"。
  • order:菜单项在“Assets/Create”菜单中的位置为1(显示靠前的优先级)

由于SO尽量存储运行时不更改的数据,所以要修改当前的生命值会考虑如下方法。此处PlayerXP实际上是个引用,在Unity中,当一个类的成员是另一个类的实例时,默认情况下它就是引用类型,不需要额外的标记(我是对比着[SerializeReference]来看,见下文 )

public class PlayerXP {public int XP = 100;
}public class PlayerData : ScriptableObject {public PlayerXP PlayerXP;
}
PlayerData playerData = GetComponent<PlayerData>();
playerData.PlayerXP.XP = 200;

注:引用类型的序列化通常会占用更多的存储空间和加载时间(性能降低)

3. 序列化:Json、XML与二进制

using UnityEngine;[System.Serializable]
public class PlayerData
{public string playerName;public int playerScore;
}

关于序列化:

  • 必须是public类,其中的字段或者属性必须是可序列化的
  • 类中的方法不会被序列化
  • 构造函数不可以被序列化

不可以序列化的数据类型:

  • 静态类或静态成员(Static Members)
  • 委托(Delegate)
  • 事件(Event)
  • 指针(Pointer)
  • 索引器(Indexers)

静态成员是属于整个类的,但是序列化和反序列化是构造一个类的实例的

// 保存
string json = JsonUtility.ToJson(sourceObject);
System.IO.File.WriteAllText("playerData.json", json);
// 读取
string json = System.IO.File.ReadAllText("playerData.json");
SomeClass loadedPlayer = JsonUtility.FromJson<SomeClass>(json);

json是字符串文本,XML是标记语言(本身还是文本),二进制就是01序列。二进制在数据存储和传输的效率、紧凑性和速度上占有优势(但丧失了内容的可读性)

二进制有很多种方案:

  • protobuf (Protocol Buffers,谷歌研发的一种二进制序列化格式)
  • MessagePack

我们可以在官方仓库找到使用说明Github - MessagePack-CSharp

注:几个含Serialize的相关属性

  • [Serializable]是一个 C# 中的特性,它告诉编译器这个类可以被序列化。
  • [SerializeReference] 是 Unity 2019.3 引入的新特性,用于处理多态对象的序列化,使得可以在 Inspector 窗口中为该字段分配任意继承自同一父类的对象。
  • [SerializeField](这个是把Private变量暴露到Inspector中的,跟上面那俩没关系)

注:标记为 [Serializable] 的类需要自行确保其内容是可序列化的。该标记的作用仅是告诉编译器这个类可以被序列化,但是不对内容做任何保证,如果存在不可被序列化的字段则会被忽略(不会引起报错)。此外还要避免类中存在循环引用(例如类 A 包含类 B 的实例,而类 B 又包含类 A 的实例)

// example
using UnityEngine;
using System;[Serializable]
public class Shape
{public float area;public virtual void Draw() { }
}[Serializable]
public class Circle : Shape
{public float radius;public override void Draw(){Debug.Log("Drawing a circle");}
}[Serializable]
public class Rectangle : Shape
{public float width;public float height;public override void Draw(){Debug.Log("Drawing a rectangle");}
}public class ShapeHolder : MonoBehaviour
{[SerializeReference]public Shape shape;
}

4. 数据库

数据库通常用于存储大量结构化数据,例如用户信息、游戏配置、游戏关卡数据、成就和统计信息等。相较于ScriptableObject、PlayerPrefs、JSON和XML文件,数据库的优势在于能够更灵活地管理和查询大量数据,并支持复杂的数据结构和关联查询。

数据库的优势包括:

  1. 数据结构灵活:数据库可以存储和管理复杂的数据结构,支持表与表之间的关联,适用于需要大量结构化数据的场景。
  2. 查询功能强大:数据库引擎提供强大的查询功能,可以进行复杂的数据筛选、排序和统计分析。
  3. 数据持久化:数据库中的数据可以持久保存,不受应用程序生命周期的影响,适用于长期存储和管理数据。
  4. 并发处理:数据库引擎通常支持并发处理,能够处理多个用户同时对数据进行读写的情况。
  5. 数据安全性:数据库可以提供数据加密、权限控制等安全功能,保护数据不被未授权访问。

参考与进一步阅读

PavCreations - Data persistence or how to save / load game data in Unity

Medium - A Beginner’s Guide to Storing and Retrieving Data in Unity

Medium - “How to Harness the Power of Scriptable Objects in Unity”

CSDN - 个人技术总结——Unity3D ScriptableObject实现多存档

CSDN - 【图文详解】Unity存储游戏数据的几种方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入浅出熟悉OpenAI最新大作Sora文生视频大模型

蠢蠢欲动&#xff0c;惴惴不安&#xff0c;朋友们我又来了&#xff0c;这个春节真的过的是像过山车&#xff0c;Gemini1.5 PRO还没过劲&#xff0c;OpenAI又放大招&#xff0c;人类真的要认输了吗&#xff0c;让我忍不住想要再探究竟&#xff0c;到底是什么让文生视频发生了质的…

头歌C++语言之选择排序练习题

目录 第1关:第二统计数字 任务描述 相关知识 数组声明: 初始化数组: 访问数组元素 选择排序 编程要求 第2关:运动会排名 任务描述 相关知识 多维数组 访问二维数组 编程要求 第3关:单词排序 任务描述 相关知识 strcmp()函数 编程要求

流星蝴蝶剑之七夜听雪中文版下载

软件介绍&#xff1a; 中文名称: 流星蝴蝶剑七夜听雪 英文名称: Meteor 游戏类型: 3D武侠格斗 发行时间: 2002年08月 制作发行: 流星江湖悠悠客栈 语言 :中文 配置要求: 操作系统&#xff1a;Windows 95 / 98 / Me / 2000 / XP 最低配置 CPU&#xff1a;Pentium II 450MHz 以上…

记录 | git win C://User/Administrator/.ssh下没有id_rsa.pub找不到

在用 ssh-keygen -t rsa -C "xxx163.com”生成后&#xff0c;在 C://User/Administrator/.ssh 下找不到 id_rsa.pub 文件 在这个下面找找&#xff1a; C:\Users\Administrator\AppData\Roaming\SPB_Data\.ssh 或者直接看 ssh-keygen 生成的终端日志&#xff0c;上面有说…

单向/双向V2G环境下分布式电源与电动汽车充电站联合配置方法(matlab代码)

目录 1 主要内容 目标函数 电动汽车负荷建模 算例系统图 程序亮点 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现博士文章《互动环境下分布式电源与电动汽车充电站的优化配置方法研究》第五章《单向/双向V2G环境下分布式电源与电动汽车充电站联合配置方法》…

0206-1-网络层

第 4 章 网络层 网络层提供的两种服务 虚电路服务 数据报服务 概要: 虚电路服务与数据报服务的对比 网际协议 IP 网际协议 IP 是 TCP/IP 体系中两个最主要的协议之一。与 IP 协议配套使用的还有四个协议&#xff1a; 地址解析协议 ARP (Address Resolution Protocol)逆地…

【鸿蒙系统学习笔记】TypeScript开发语言

一、背景 HarmonyOS 应用的主要开发语言是 ArkTS&#xff0c;它由 TypeScript&#xff08;简称TS&#xff09;扩展而来&#xff0c;在继承TypeScript语法的基础上进行了一系列优化&#xff0c;使开发者能够以更简洁、更自然的方式开发应用。值得注意的是&#xff0c;TypeScrip…

34、商城系统(十五):认证服务,短信验证码,密码加盐,OAuth2.0社交登录,SpringSession认证功能,单点登录

目录 一、新建认证服务 1.后端项目启动 2.前端页面复制 3.配置域名 4.配置gateway

在 CentOS 上安装 JDK 1.8

要在 CentOS 上安装 JDK 1.8&#xff0c;您可以按照以下步骤进行操作&#xff1a; 打开终端&#xff08;命令行界面&#xff09;。 检查您的系统是否已经配置了正确的软件源。可以执行以下命令来更新软件包索引&#xff1a; sudo yum update使用以下命令安装 OpenJDK 1.8&…

Spring整合Mybatis之DAO层、Service层开发

3. Spring整合Mybatis编程DAO层开发 1. 项目引入相关依赖spring mybatis mysql mybatis-spring druid2. 编写spring.xml整合&#xff1a;spring 接管 mybatis 中 SqlSessionFactory对象的创建<!--创建DataSource--><bean class"com.alibaba.druid.pool.…

8、内网安全-横向移动RDPKerberos攻击SPN扫描WinRMWinRS

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正 目录 一、域横向移动-RDP-明文&NTLM 1.探针服务&#xff1a; 2.探针连接&#xff1a; 3.连接执行&#xff1a; 二、域横向移动-WinRM&WinRS-明文&NTLM 1.探针可用&#xff1a; 2.连接…

【PyQt】14-绘图-QPainter

文章目录 前言一、QPainter二、绘制文本-drawTextQt里面的文本对齐方式 运行结果 三、像素点总结 前言 1、学会画图方法 一、QPainter 通常可以绘制文本、各种图形&#xff08;点、线、椭圆、弧、扇形、多边形等等&#xff09;、图像。 必须在painrEvent事件方法中绘制各种元…

Eclipse 分栏显示同一文件

Eclipse 分栏显示同一文件 1. Window -> EditorReferences 1. Window -> Editor Toggle Split Editor (Horizontal) &#xff1a;取消或设置水平分栏显示 Toggle Split Editor (Vertical) &#xff1a;取消或设置垂直分栏显示 References [1] Yongqiang Cheng, https:/…

Django后端开发——mysql数据库连接遇到的问题及解决

文章目录 参考资料问题描述情况描述解决方案step1&#xff1a;管理员权限进入mysql&#xff0c;重置root密码step2&#xff1a;重启mysql服务器 参考资料 stackflow帖子&#xff1a;https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-ro…

Unity ScreenPointToRay 获取到的坐标不准确

&#x1f47e;奇奇怪怪的 &#x1f959;问题描述&#x1f96a;解决方案&#x1f37f;验证代码 &#x1f959;问题描述 使用&#xff1a;Camera.main.ScreenPointToRay 将鼠标坐标转换成射线&#xff0c;然后通过&#xff1a;Physics.Raycast 获取到射线碰撞到的坐标&#xff0…

kubeasz部署k8s:v1.27.5集群

安装k8s集群相关系统及组件的详细版本号 Ubuntu 22.04.3 LTS k8s: v1.27.5 containerd: 1.6.23 etcd: v3.5.9 coredns: 1.11.1 calico: v3.24.6 安装步骤清单&#xff1a; 1.deploy机器做好对所有k8s node节点的免密登陆操作 2.deploy机器安装好python2版本以及pip&#xff0c;…

windows安装Mysql解压版

windows安装Mysql解压版 一、下载mysql-8.0.36-winx64.zip二、解压三、配置3.1. 添加环境变量&#xff1a;新建MYSQL_HOME3.2.如何验证是否添加成功&#xff1a;必须以管理员身份启动3.3. 初始化MySQL&#xff1a;必须以管理员身份启动3.4. 注册MySQL服务&#xff1a;必须以管理…

OpenAI视频生成模型Sora背后的技术及其深远的影响

前言 Sora的视频生成技术在保真度、长度、稳定性、一致性、分辨率和文字理解等方面都达到了当前最优水平。其核心技术包括使用视觉块编码将不同格式的视频统一编码成Transformer可训练的嵌入向量&#xff0c;以及类似于扩散过程的UNet方法进行降维和升维的加噪与去噪操作。通过…

Tomcat多实例配置与应用的深入讲解

Tomcat多实例配置与应用的深入讲解 一、概述 Tomcat是一款广泛使用的Web服务器&#xff0c;它可以同时处理多个HTTP请求。在某些场景下&#xff0c;我们需要在同一台服务器上部署多个Tomcat实例&#xff0c;以满足不同的业务需求。本文将详细介绍如何配置Tomcat多实例&#x…