目录
1.BinaryWriter扩展,GameDataWriter
2.BinaryReader扩展,GameDataReader
微软已经封装了二进制读写,在System.IO下的BinaryWriter和BinaryReader
在unity内扩展Quaternion、Vector3的读写
1.BinaryWriter扩展,GameDataWriter
using System.IO;
using UnityEngine;
public class GameDataWriter {
BinaryWriter writer;
public GameDataWriter (BinaryWriter writer) {
this.writer = writer;
}
public void Write (float value) {
writer.Write(value);
}
public void Write (int value) {
writer.Write(value);
}
public void Write (Quaternion value) {
writer.Write(value.x);
writer.Write(value.y);
writer.Write(value.z);
writer.Write(value.w);
}
public void Write (Vector3 value) {
writer.Write(value.x);
writer.Write(value.y);
writer.Write(value.z);
}
}
如果是保存颜色
public void Write (Color value) {
writer.Write(value.r);
writer.Write(value.g);
writer.Write(value.b);
writer.Write(value.a);
}
2.BinaryReader扩展,GameDataReader
using System.IO;
using UnityEngine;
public class GameDataReader {
BinaryReader reader;
public GameDataReader (BinaryReader reader) {
this.reader = reader;
}
public float ReadFloat () {
return reader.ReadSingle();
}
public int ReadInt () {
return reader.ReadInt32();
}
public Quaternion ReadQuaternion () {
Quaternion value;
value.x = reader.ReadSingle();
value.y = reader.ReadSingle();
value.z = reader.ReadSingle();
value.w = reader.ReadSingle();
return value;
}
public Vector3 ReadVector3 () {
Vector3 value;
value.x = reader.ReadSingle();
value.y = reader.ReadSingle();
value.z = reader.ReadSingle();
return value;
}
}
3.基础组件PersistableObject
using UnityEngine;
[DisallowMultipleComponent]
public class PersistableObject : MonoBehaviour {
public virtual void Save (GameDataWriter writer) {
writer.Write(transform.localPosition);
writer.Write(transform.localRotation);
writer.Write(transform.localScale);
}
public virtual void Load (GameDataReader reader) {
transform.localPosition = reader.ReadVector3();
transform.localRotation = reader.ReadQuaternion();
transform.localScale = reader.ReadVector3();
}
}
4.持久化存储管理 PersistentStorage
using System.IO;
using UnityEngine;
public class PersistentStorage : MonoBehaviour {
string savePath;
void Awake () {
savePath = Path.Combine(Application.persistentDataPath, "saveFile");
Debug.Log("savePath:"+ savePath);
}
public void Save (PersistableObject o) {
using (
var writer = new BinaryWriter(File.Open(savePath, FileMode.Create))
) {
o.Save(new GameDataWriter(writer));
}
}
public void Load (PersistableObject o) {
using (
var reader = new BinaryReader(File.Open(savePath, FileMode.Open))
) {
o.Load(new GameDataReader(reader));
}
}
}
5.持久化存储调用Demo
using System.Collections.Generic;
using UnityEngine;
public class Game : PersistableObject {
public PersistableObject prefab;
public KeyCode createKey = KeyCode.C;
public KeyCode newGameKey = KeyCode.N;
public KeyCode saveKey = KeyCode.S;
public KeyCode loadKey = KeyCode.L;
public PersistentStorage storage;
List<PersistableObject> objects;
void Awake () {
objects = new List<PersistableObject>();
}
void Update () {
if (Input.GetKeyDown(createKey)) {
CreateObject();
}
else if (Input.GetKeyDown(newGameKey)) {
BeginNewGame();
}
else if (Input.GetKeyDown(saveKey)) {
storage.Save(this);
}
else if (Input.GetKeyDown(loadKey)) {
BeginNewGame();
storage.Load(this);
}
}
void BeginNewGame () {
for (int i = 0; i < objects.Count; i++) {
Destroy(objects[i].gameObject);
}
objects.Clear();
}
void CreateObject () {
PersistableObject o = Instantiate(prefab);
Transform t = o.transform;
t.localPosition = Random.insideUnitSphere * 5f;
t.localRotation = Random.rotation;
t.localScale = Vector3.one * Random.Range(0.1f, 1f);
objects.Add(o);
}
public override void Save (GameDataWriter writer) {
writer.Write(objects.Count);
for (int i = 0; i < objects.Count; i++) {
objects[i].Save(writer);
}
}
public override void Load (GameDataReader reader) {
int count = reader.ReadInt();
for (int i = 0; i < count; i++) {
PersistableObject o = Instantiate(prefab);
o.Load(reader);
objects.Add(o);
}
}
}
参考https://zhuanlan.zhihu.com/p/208321484