创建可序列化的对象,存储玩家位置
SerializableVector3_X
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- namespace RPG.Saving
- {
- [System.Serializable]
- public class SerializableVector3_X
- {
- float x, y, z;
-
- public SerializableVector3_X(Vector3 vector)
- {
- x = vector.x;
- y = vector.y;
- z = vector.z;
- }
-
- public Vector3 ToVector()
- {
- return new Vector3(x, y, z);
- }
- }
- }
复制代码
SavingSystem_X
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Runtime.Serialization.Formatters.Binary;
- using System.Text;
- using UnityEngine;
-
- namespace RPG.Saving
- {
- //
- public class SavingSystem_X : MonoBehaviour
- {
- public void save(string saveFile)//// 保存游戏状态到指定文件
- {
- string path = GetPathFromSaveFile(saveFile);// 获取保存文件的完整路径
- print("存档"+path);
-
- using (FileStream stream = File.Open(path, FileMode.Create)) // 使用 FileStream 创建或覆盖文件
- {
- Transform playerTransform = GetPlayerTransform();// 获取玩家的 Transform
- BinaryFormatter formatter = new BinaryFormatter(); //创建二进制格式化程序,用于序列化对象
- SerializableVector3_X position = new SerializableVector3_X( playerTransform.position);// 创建可序列化的 Vector3 对象,存储玩家位置
- formatter.Serialize(stream,position); // 将位置对象序列化并写入文件流
-
- }
- }
-
- public void Load(string saveFile)//// 从指定文件加载游戏状态
- {
- string path = GetPathFromSaveFile(saveFile);// 获取保存文件的完整路径
- print("加载" + path);
- using (FileStream stream = File.Open(path, FileMode.Open))// 使用 FileStream 打开文件以读取
- {
-
- Transform playerTransform = GetPlayerTransform(); // 获取玩家的 Transform
- BinaryFormatter formatter = new BinaryFormatter();// 创建二进制格式化程序,用于反序列化对象
- SerializableVector3_X position =(SerializableVector3_X)formatter.Deserialize(stream);// 反序列化文件流中的位置对象
- playerTransform.position = position.ToVector(); // 将反序列化的位置赋值给玩家的 Transform
- }
- }
-
- private Transform GetPlayerTransform()// 获取玩家的 Transform 组件
- {
- return GameObject.FindWithTag("Player").transform;// 根据标签查找玩家对象并返回其 Transform
- }
-
- private byte[] SerializeVector(Vector3 vector)// 将 Vector3 序列化为字节数组
- {
- byte[] vectorBytes = new byte[3 * 4];
- BitConverter.GetBytes(vector.x).CopyTo(vectorBytes,0);
- BitConverter.GetBytes(vector.y).CopyTo(vectorBytes, 4);
- BitConverter.GetBytes(vector.z).CopyTo(vectorBytes, 8);
- return vectorBytes;
- }
-
- private Vector3 DeserializeVector(byte[] buffer) // 从字节数组反序列化为 Vector3
- {
- Vector3 result = new Vector3();
- result.x = BitConverter.ToSingle(buffer, 0);
- result.y = BitConverter.ToSingle(buffer, 4);
- result.z = BitConverter.ToSingle(buffer, 8);
- return result;
- }
-
- private string GetPathFromSaveFile(string saveFile) // 用于构造保存文件的完整路径
- {
- return Path.Combine(Application.persistentDataPath,saveFile+".sav"); // 结合持久数据路径与给定的保存文件名,并添加 ".sav" 扩展名
- }
- }
- }
-
复制代码
|