Udemy-Unity制作类暗黑破坏神游戏记录-P91

2024-09-23
133看过
创建可序列化的对象,存储玩家位置

SerializableVector3_X

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace RPG.Saving
  5. {
  6.     [System.Serializable]
  7.     public class SerializableVector3_X
  8.     {
  9.         float x, y, z;
  10.         public SerializableVector3_X(Vector3 vector)
  11.         {
  12.             x = vector.x;
  13.             y = vector.y;
  14.             z = vector.z;
  15.         }
  16.         public Vector3 ToVector()
  17.         {
  18.             return new Vector3(x, y, z);
  19.         }
  20.     }
  21. }
复制代码
SavingSystem_X

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Runtime.Serialization.Formatters.Binary;
  6. using System.Text;
  7. using UnityEngine;
  8. namespace RPG.Saving
  9. {
  10.     //
  11.     public class SavingSystem_X : MonoBehaviour
  12.     {
  13.         public void save(string saveFile)//// 保存游戏状态到指定文件
  14.         {
  15.             string path = GetPathFromSaveFile(saveFile);// 获取保存文件的完整路径
  16.             print("存档"+path);
  17.             
  18.             using (FileStream stream = File.Open(path, FileMode.Create)) // 使用 FileStream 创建或覆盖文件
  19.             {
  20.                 Transform playerTransform = GetPlayerTransform();// 获取玩家的 Transform
  21.                 BinaryFormatter formatter = new BinaryFormatter(); //创建二进制格式化程序,用于序列化对象
  22.                 SerializableVector3_X position = new SerializableVector3_X( playerTransform.position);// 创建可序列化的 Vector3 对象,存储玩家位置
  23.                 formatter.Serialize(stream,position); // 将位置对象序列化并写入文件流
  24.             }
  25.         }
  26.         public void Load(string saveFile)//// 从指定文件加载游戏状态
  27.         {
  28.             string path = GetPathFromSaveFile(saveFile);// 获取保存文件的完整路径
  29.             print("加载" + path);
  30.             using (FileStream stream = File.Open(path, FileMode.Open))// 使用 FileStream 打开文件以读取
  31.             {
  32.                
  33.                 Transform playerTransform = GetPlayerTransform(); // 获取玩家的 Transform
  34.                 BinaryFormatter formatter = new BinaryFormatter();// 创建二进制格式化程序,用于反序列化对象
  35.                 SerializableVector3_X position =(SerializableVector3_X)formatter.Deserialize(stream);// 反序列化文件流中的位置对象
  36.                 playerTransform.position = position.ToVector(); // 将反序列化的位置赋值给玩家的 Transform
  37.             }
  38.         }
  39.         private Transform GetPlayerTransform()// 获取玩家的 Transform 组件
  40.         {
  41.             return GameObject.FindWithTag("Player").transform;// 根据标签查找玩家对象并返回其 Transform
  42.         }
  43.         private byte[] SerializeVector(Vector3 vector)// 将 Vector3 序列化为字节数组
  44.         {
  45.             byte[] vectorBytes = new byte[3 * 4];
  46.             BitConverter.GetBytes(vector.x).CopyTo(vectorBytes,0);
  47.             BitConverter.GetBytes(vector.y).CopyTo(vectorBytes, 4);
  48.             BitConverter.GetBytes(vector.z).CopyTo(vectorBytes, 8);
  49.             return vectorBytes;
  50.         }
  51.         private Vector3 DeserializeVector(byte[] buffer)   // 从字节数组反序列化为 Vector3
  52.         {
  53.             Vector3 result = new Vector3();
  54.             result.x = BitConverter.ToSingle(buffer, 0);
  55.             result.y = BitConverter.ToSingle(buffer, 4);
  56.             result.z = BitConverter.ToSingle(buffer, 8);
  57.             return result;
  58.         }
  59.         private string GetPathFromSaveFile(string saveFile) // 用于构造保存文件的完整路径
  60.         {
  61.             return Path.Combine(Application.persistentDataPath,saveFile+".sav");  // 结合持久数据路径与给定的保存文件名,并添加 ".sav" 扩展名
  62.         }
  63.     }
  64. }
复制代码


回复

举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表