仿朋友圈网站建设,国内有哪些响应式网站,wordpress 主题功能,wordpress组件正文
主要方法#xff1a;
ScriptableObjectPlayerPrefsJSONXML数据库#xff08;如Sqlite#xff09;
1. PlayerPerfs
PlayerPrefs 存储的数据是全局共享的#xff0c;它们存储在用户设备的本地存储中#xff0c;并且可以被应用程序的所有部分访问。这意味着#xf…正文
主要方法
ScriptableObjectPlayerPrefsJSONXML数据库如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 引擎管理的。
使用流程
派生自ScriptableObject创建基类实例化后由编辑器对实例进行配置其他C#脚本使用某个实例合理使用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 GetComponentPlayerData();
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.FromJsonSomeClass(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文件数据库的优势在于能够更灵活地管理和查询大量数据并支持复杂的数据结构和关联查询。
数据库的优势包括
数据结构灵活数据库可以存储和管理复杂的数据结构支持表与表之间的关联适用于需要大量结构化数据的场景。查询功能强大数据库引擎提供强大的查询功能可以进行复杂的数据筛选、排序和统计分析。数据持久化数据库中的数据可以持久保存不受应用程序生命周期的影响适用于长期存储和管理数据。并发处理数据库引擎通常支持并发处理能够处理多个用户同时对数据进行读写的情况。数据安全性数据库可以提供数据加密、权限控制等安全功能保护数据不被未授权访问。
参考与进一步阅读
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存储游戏数据的几种方法