• Unity类银河恶魔城学习记录13-1 p142 Save system源代码


       Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考
    此代码仅为较上一P有所改变的代码

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

     FileDataHandler.cs
    1. using System;
    2. using System.IO;
    3. using UnityEngine;
    4. public class FileDataHandler
    5. {
    6. private string dataDirPath = "";
    7. private string dataFileName = "";
    8. public FileDataHandler(string _dataDirPath, string _dataFilePath)//构造函数拿到需要保存的位置和文件名称
    9. {
    10. dataDirPath = _dataDirPath;
    11. dataFileName = _dataFilePath;
    12. }
    13. public void Save(GameData _data)
    14. {
    15. string fullPath = Path.Combine(dataDirPath, dataFileName);//合成路径函数 将位置和文件合并成实际的可以读取的路径
    16. try//用try防止其报错
    17. {
    18. Directory.CreateDirectory(Path.GetDirectoryName(fullPath));//通过路径创建出需要的文件,存在就不创建了
    19. string dataToStore = JsonUtility.ToJson(_data, true);//将传过来的gameData转换成文本形式并且使其可读
    20. using (FileStream stream = new FileStream(fullPath, FileMode.Create))//两个using 第一个进入文件使其变为可编写模式
    21. {
    22. using (StreamWriter writer = new StreamWriter(stream))//第二个拿到文件对其进行编辑
    23. {
    24. writer.Write(dataToStore);//写入函数
    25. }
    26. }
    27. }
    28. catch (Exception e)
    29. {
    30. Debug.LogError("Error on trying to save data to file " + fullPath + "\n" + e);
    31. }
    32. }
    33. public GameData Load()//同上
    34. {
    35. string fullPath = Path.Combine(dataDirPath, dataFileName);
    36. GameData loadData = null;
    37. if (File.Exists(fullPath))
    38. {
    39. try
    40. {
    41. string dataToLoad = "";
    42. using (FileStream stream = new FileStream(fullPath, FileMode.Open))
    43. {
    44. using (StreamReader reader = new StreamReader(stream))
    45. {
    46. dataToLoad = reader.ReadToEnd();
    47. }
    48. }
    49. loadData = JsonUtility.FromJson(dataToLoad);//转换为游戏需要的类型
    50. }
    51. catch (Exception e)
    52. {
    53. Debug.LogError(e);
    54. }
    55. }
    56. return loadData;
    57. }
    58. }

    ISaveManager.cs
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. public interface ISaveManager
    5. {
    6. void LoadData(GameData _data);
    7. void SaveData(ref GameData _data);
    8. }

    SaveManager.cs
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. using System.Linq;
    5. public class SaveManager : MonoBehaviour
    6. {
    7. public static SaveManager instance;
    8. [SerializeField] private string fileName;
    9. GameData gameData;
    10. private List saveManagers;
    11. private FileDataHandler dataHandler;
    12. private void Awake()
    13. {
    14. if (instance != null)
    15. Destroy(instance);
    16. else
    17. instance = this;
    18. }
    19. private void Start()
    20. {
    21. dataHandler = new FileDataHandler(Application.persistentDataPath, fileName);
    22. saveManagers = FindAllSaveManagers();
    23. LoadGame();
    24. }
    25. public void NewGame()
    26. {
    27. gameData = new GameData();
    28. }
    29. public void LoadGame()
    30. {
    31. gameData = dataHandler.Load();
    32. if(this.gameData == null)
    33. {
    34. Debug.Log("No data");
    35. NewGame();
    36. }
    37. foreach(ISaveManager saveManager in saveManagers)//循环调用所有的找到脚本的LoadData和SaveData到,这样便可以将所有的数据汇聚到gameData中,并从中拿到data
    38. {
    39. saveManager.LoadData(gameData);
    40. }
    41. Debug.Log("Loaded currency " + gameData.currency);
    42. }
    43. public void SaveGame()循环调用所有的找到脚本的LoadData和SaveData到,这样便可以将所有的数据汇聚到gameData中,并从中拿到data
    44. {
    45. foreach(ISaveManager saveManager in saveManagers)
    46. {
    47. saveManager.SaveData(ref gameData);
    48. }
    49. dataHandler.Save(gameData);
    50. }
    51. private void OnApplicationQuit()
    52. {
    53. SaveGame();
    54. }
    55. private List FindAllSaveManagers()//全局寻找带ISave的脚本的函数
    56. {
    57. IEnumerable saveManager = FindObjectsOfType().OfType();
    58. return new List(saveManager);
    59. }
    60. }

    GameData.cs
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. [System.Serializable]
    5. public class GameData
    6. {
    7. public int currency;
    8. public GameData()
    9. {
    10. this.currency = 0;
    11. }
    12. }
    PlayerManager.cs
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using Unity.VisualScripting;
    4. using UnityEngine;
    5. public class PlayerManager : MonoBehaviour, ISaveManager
    6. {
    7. public static PlayerManager instance;
    8. public Player player;//这是通过在外部设置了一个组件,让这个组件能够直接把Player找到,从而减少FInd的方式所带来的高负载
    9. public int currency;
    10. private void Awake()
    11. {
    12. if(instance != null)
    13. {
    14. Destroy(instance.gameObject);
    15. }
    16. else
    17. instance = this;
    18. }
    19. public bool HaveEnoughMoney(int _price)
    20. {
    21. if(_price > currency)
    22. {
    23. Debug.Log("Not enough money");
    24. return false;
    25. }
    26. currency -= _price;
    27. return true;
    28. }
    29. public int GetCurrency() => currency;
    30. public void LoadData(GameData _data)
    31. {
    32. currency = _data.currency;
    33. }
    34. public void SaveData(ref GameData _data)
    35. {
    36. _data.currency = this.currency;
    37. }
    38. }

  • 相关阅读:
    【unity记录】导入标准资源包(Standard Assets)
    C++ 同构字符串/ 单词规律
    Lnmp架构
    软件测试之Python基础学习
    树莓派4B_OpenCv学习笔记21:OpenCV_haar人脸识别
    逻辑回归模型构建+PDP(部分依赖图)解析——Python代码及运行结果分析
    BMC Helix解决方案落地亚马逊云科技中国区域,同时上线Marketplace
    【点云处理】点云法向量估计及其加速(5)
    计算机网络 | 数据链路层
    dpdk 将arp和icmp数据包交给kni 实现ping
  • 原文地址:https://blog.csdn.net/Homura_/article/details/137889585