Unity类银河战士恶魔城学习总结(P142 Save System 保存系统)

news/2024/11/29 0:58:24/

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili

教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/

本章节实现了保存系统的初步建立

windows系统最终货币的保存文件被保存在如下路径下

SaveManager.cs

功能概述

SaveManager 是一个单例模式的组件,负责以下任务:

  1. 管理游戏存档数据:存储和处理当前的游戏数据。
  2. 与游戏中的数据模块交互:通过接口 ISaveManager 收集实现该接口的脚本,以便统一管理存储和加载逻辑。
  3. 文件操作:通过 FileDataHandler 类完成数据的实际存储和加载到磁盘。

1. 单例模式

作用:确保 SaveManager 只有一个实例,全局共享。

2. Start()函数

  • 逻辑
    • 创建一个文件数据处理器 dataHandler,负责读写存档数据。
    • 收集所有实现了 ISaveManager 接口的脚本。
    • 自动加载游戏数据。
  • 生命周期方法
    • OnApplicationQuit() 在游戏退出时自动保存游戏。

3. 存档管理逻辑

(1)新建存档:NewGame()函数

作用:创建一个新的 GameData 对象,作为空白存档。

(2)加载存档:LoadGame()函数

  • 调用 dataHandler.Load() 从文件中加载存档。
  • 如果没有找到存档,则调用 NewGame() 创建一个空白存档。
  • 遍历所有 ISaveManager 实现,调用它们的 LoadData 方法,将存档数据同步到游戏对象中。

(3)保存存档:SaveGame()函数

  • 遍历所有实现 ISaveManager 的脚本,调用它们的 SaveData 方法,将游戏状态保存到 gameData 中。
  • gameData 写入磁盘文件。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;//2024.11.25
public class SaveManager : MonoBehaviour
{public static SaveManager instance;[SerializeField] private string fileName;private GameData gameData;private List<ISaveManager> saveManagers = new List<ISaveManager>();private FileDataHandler dataHandler;private void Awake(){if (instance != null)Destroy(instance.gameObject);elseinstance = this;}private void Start(){dataHandler = new FileDataHandler(Application.persistentDataPath,fileName);saveManagers = FindAllSaveManagers();LoadGame();}public void NewGame(){gameData = new GameData();}public void LoadGame(){gameData = dataHandler.Load();if (this.gameData == null){Debug.Log("没有找到存档");NewGame();}foreach (ISaveManager saveManager in saveManagers){saveManager.LoadData(gameData);}}public void SaveGame(){foreach(ISaveManager saveManager in saveManagers){saveManager.SaveData(ref gameData);}dataHandler.Save(gameData);}private void OnApplicationQuit(){SaveGame();}private List<ISaveManager> FindAllSaveManagers(){IEnumerable<ISaveManager> saveManagers = FindObjectsOfType<MonoBehaviour>().OfType<ISaveManager>();return new List<ISaveManager>(saveManagers);}
}

GameData.cs

用于存放需要保存的数据的一个类!!!

这里只写了货币

using System.Collections;
using System.Collections.Generic;
using UnityEngine;//2024.11.25
[System.Serializable]
public class GameData
{public int currency;public GameData(){this.currency = 0;}}

ISaveManager.cs

类似于一个接口

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public interface ISaveManager
{void LoadData(GameData _data);void SaveData(ref GameData _data);}

PlayerManager.cs

进行了一些实例化

using System.Collections;
using System.Collections.Generic;
using UnityEngine;//P63,制作玩家管理器和技能管理器
//可以在SkeletonBattleState中通过PlayerManager.instance.player.transform获取到玩家的位置
public class PlayerManager : MonoBehaviour,ISaveManager
{//全局访问public static PlayerManager instance;//单例模式public Player player;public int currency;private void Awake(){if (instance != null)Destroy(instance.gameObject);elseinstance = this;}public bool HaveEnoughMoney(int _price)//是否有钱去买技能{if (_price > currency){Debug.Log("没有足够的钱");return false;}elsecurrency -= _price;return true;}public int GetCurrency() => currency;//返回当前的货币数量public void LoadData(GameData _data){currency = _data.currency;}public void SaveData(ref GameData _data){_data.currency = this.currency;  }
}

FileDataHandler.cs

不必懂

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.IO;public class FileDataHandler
{private string dataDirPath = "";private string dataFileName = "";public FileDataHandler(string _dataDirPath, string _dataFileName){dataDirPath = _dataDirPath;dataFileName = _dataFileName;}public void Save(GameData _data){string fullPath = Path.Combine(dataDirPath, dataFileName);try{Directory.CreateDirectory(Path.GetDirectoryName(fullPath));string dataToStore = JsonUtility.ToJson(_data, true);using (FileStream stream = new FileStream(fullPath, FileMode.Create)){using (StreamWriter writer = new StreamWriter(stream)){writer.Write(dataToStore);}}}catch (Exception e){Debug.LogError("保存数据错误: " + fullPath + "\n" + e);}}public GameData Load()//同上{string fullPath = Path.Combine(dataDirPath, dataFileName);GameData loadData = null;if (File.Exists(fullPath)){try{string dataToLoad = "";using (FileStream stream = new FileStream(fullPath, FileMode.Open)){using (StreamReader reader = new StreamReader(stream)){dataToLoad = reader.ReadToEnd();}}loadData = JsonUtility.FromJson<GameData>(dataToLoad);}catch (Exception e){Debug.LogError("读取数据错误: " + fullPath + "\n" + e);}}return loadData;}
}


http://www.ppmy.cn/news/1550769.html

相关文章

九、Ubuntu Linux操作系统

一、Ubuntu简介 Ubuntu Linux是由南非人马克沙特尔沃思(Mark Shutteworth)创办的基于Debian Linux的操作系统&#xff0c;于2004年10月公布Ubuntu是一个以桌面应用为主的Linux发行版操作系统Ubuntu拥有庞大的社区力量&#xff0c;用户可以方便地从社区获得帮助其官方网站:http…

在React中实践一些软件设计思想 ✅

策略设计模式 先写几句废话&#xff1a;其实在日常开发中&#xff0c;「设计模式」通常在不知不觉间已经被用了不少了&#xff0c;只是我们或许没察觉。比如通过插槽来增强组件的功能&#xff0c;这涉及到「装饰设计模式」&#xff1b;lodash或者jQuery的使用我觉得甚至算得上…

windows docker 入门

这个教程将指导你如何安装Docker、运行第一个容器以及理解一些基本概念。 第一步&#xff1a;安装Docker Desktop for Windows 系统要求&#xff1a; Windows 10 64位版本&#xff08;专业版、企业版或教育版&#xff09;。启用Hyper-V和Windows Subsystem for Linux (WSL 2)。…

React的基础知识:Context

1. Context 在 React 中&#xff0c;Context 提供了一种通过组件树传递数据的方式&#xff0c;无需手动在每个层级传递 props。这在处理一些全局应用状态时非常有用&#xff0c;比如用户认证、主题、语言偏好等。 如何使用 Context 创建 Context&#xff1a;首先&#xff0c;…

服务器记录所有用户docker操作,监控删除容器/镜像的人

文章目录 使用场景安装auditd添加docker审计规则设置监控日志大小与定期清除查询 Docker 操作日志查看所有用户&#xff0c;所有操作日志查看特定用户的 Docker 操作查看所有用户删除容器/镜像日志过滤特定时间范围内日志 使用场景 多人使用的服务器&#xff0c;使用的docker …

神经网络的数学——一个完整的例子

神经网络是一种人工智能方法&#xff0c;它教导计算机以类似于人脑的方式处理数据。神经网络通过输入多个数据实例、预测输出、找出实际答案与机器答案之间的误差&#xff0c;然后微调权重以减少此误差来进行学习。 虽然神经网络看起来非常复杂&#xff0c;但它实际上是线性代数…

我们来学mysql -- EXPLAIN之ref(原理篇)

EXPLAIN之ref 题记**ref** 题记 书接上文《 EXPLAIN之type》2024美国大选已定&#xff0c;川普剑登上铁王座&#xff0c;在此过程中出谋划策的幕僚很重要&#xff0c;是他们决定了最终的执行计划在《查询成本之索引选择》中提到&#xff0c;explain的输出&#xff0c;就是优化…

Linux系统编程学习 NO.12——进程控制、shell的模拟实现

进程创建 在已学习的知识体系下&#xff0c;在Linux系统中创建一个进程可以通过./程序名称 创建并运行我们自己写的可执行程序。以及使用fork()函数在代码中创建一个子进程。 而fork()函数的使用上篇文章已有介绍&#xff0c;这里不赘述。简单复习一下fork()函数具体做了什么…