PlayerPres类
这个类简单易懂,但只能存取int,float,string类,而且在调试过程中所产生的变化都会保留,最重要的是污染注册表。
脚本序列化
序列化是将数据结构或对象状态转换为 Unity 可存储并在以后可重构的格式的自动过程。Unity 的一些内置功能会使用序列化,比如保存和加载、Inspector 窗口、实例化和预制件等功能。
序列化规则
Unity 中的序列化程序在实时游戏环境中运行。这对性能有重大影响。因此,Unity 中的序列化与其他编程环境中的序列化具有不同的行为。以下部分概述了如何在 Unity 中使用序列化。要使用字段序列化,必须确保其:
- 为
public ,或具有 SerializeField属性 - 非
static - 非
const - 非
readonly - 具有可序列化的
fieldtype 。
可序列化的简单字段类型
- 具有
Serializable 属性的自定义非抽象、非泛型类 - 具有
Serializable 属性的自定义结构 - 可序列化的简单字段类型的数组、
List<T> - 原始数据类型(
int 、float 、double 、bool 、string 等) - 枚举类型
- 某些 Unity 内置类型:
Vector2 、Vector3 、Vector4 、Rect 、Quaternion 、Matrix4x4 、`
存储无法序列化类的解决方法
总之,确保自定义类可序列化需要具有 Serializable 属性、非抽象、非静态、非泛型(但可继承自泛型类)
此外在某些情况下,脚本序列化可能会导致错误。
从构造函数或字段初始化函数以及反序列化期间调用 Unity Scripting API
在 MonoBehaviour构造函数或字段初始化函数中调用诸如 GameObject.Find 之类的脚本 API 会触发错误:“Find is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call in in Awake or Start instead.”
解决此问题的方法是在 MonoBehaviour.Start中而不是在构造函数中调用脚本 API。
Json类
之所以要了解序列化的知识,就是因为Json存储就是通过序列化来实现的
首先我们需要创建一个类来表明需要存储哪些数据
Json文件如何转化
使用unity中的JsonUtility类可以让可序列化对象和Json数据相互转换
注意:
- File类需要
using System.IO - Application.persistentDataPath 返回一个持久数据目录的路径(不同平台的路径不同,因此也不用担心存档找不到)
- Path.Combine 将string类型合并成路径名
- File.WriteAllText(string path,string contents)
我们创建该类的实例便可以储存,如果是敌人的话,创建多个实例存储即可
此外呢,还有.FromJsonOverwrite可以重写原有数据,用于覆盖存档
|