编写存档系统,存储角色transform,Vector3和字节之间的转换。
SavingSystem_X
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Text;
- using UnityEngine;
-
- namespace RPG.Saving
- {
- //
- public class SavingSystem_X : MonoBehaviour
- {
- public void save(string saveFile)//// 保存游戏状态到指定文件
- {
- string path = GetPathFromSaveFile(saveFile);// 获取保存文件的完整路径
- print("存档"+path);
- // 使用 FileStream 创建或覆盖文件
- using (FileStream stream = File.Open(path, FileMode.Create)) // 使用 using 确保文件在使用完后自动关闭,避免异常
- {
- Transform playerTransform = GetPlayerTransform();// 获取玩家的 Transform
- byte[] buffer = SerializeVector(playerTransform.position);// 将玩家位置序列化为字节数组
- stream.Write(buffer, 0, buffer.Length); // 将字节数组写入文件
- }
- }
-
- public void Load(string saveFile)//// 从指定文件加载游戏状态
- {
- string path = GetPathFromSaveFile(saveFile);// 获取保存文件的完整路径
- print("加载" + path);
- using (FileStream stream = File.Open(path, FileMode.Open))// 使用 FileStream 打开文件以读取
- {
- byte[] buffer = new byte[stream.Length];// 创建一个字节数组以存储文件内容
- stream.Read(buffer,0, buffer.Length); // 读取文件内容到字节数组中
-
- Transform playerTransform = GetPlayerTransform(); // 获取玩家的 Transform
- playerTransform.position = DeserializeVector(buffer);// 反序列化位置并赋值给玩家
- }
- }
-
- 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" 扩展名
- }
- }
- }
-
复制代码
|