本章节制作了在unity中删除存档的功能
源代码
FileDataHandler.cs
using System;
using System.IO;
using UnityEngine;
public class FileDataHandler
{
private string dataDirPath = "";
private string dataFileName = "";
public FileDataHandler(string _dataDirPath, string _dataFileName)
{
this.dataDirPath = _dataDirPath;
this.dataFileName = _dataFileName;
}
public void Save(GameData _data)
{
//保存至本地
//合成路径函数 将位置和文件合并成实际的可以读取的路径
string fullPath = Path.Combine(dataDirPath, dataFileName);
//用try防止其报错
try
{
//通过路径创建出需要的文件,存在就不创建了
Directory.CreateDirectory(Path.GetDirectoryName(fullPath));
//将传过来的gameData转换成文本形式并且使其可读
string dataToStore = JsonUtility.ToJson(_data, true);
//两个using 第一个进入文件使其变为可编写模式
using (FileStream stream = new FileStream(fullPath, FileMode.Create))
{
//第二个拿到文件对其进行编辑
using (StreamWriter writer = new StreamWriter(stream))
{
//写入函数
writer.Write(dataToStore);
}
}
}
catch (Exception ex)
{
Debug.LogError("保存存档时出错:" + fullPath + "\n" + ex);
}
}
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();
}
}
//将Json文件转换为游戏所需要的格式
loadData = JsonUtility.FromJson<GameData>(dataToLoad);
}
catch (Exception ex)
{
Debug.LogError("加载存档时出错:" + fullPath + "\n" + ex);
}
}
return loadData;
}
public void Delete()
{
string fullPath = Path.Combine(dataDirPath, dataFileName);
if(File.Exists(fullPath))
File.Delete(fullPath);
}
}
SaveManager.cs
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class SaveManager : MonoBehaviour
{
public static SaveManager instance;
[SerializeField] private string fileName;
private GameData gameData;
private List<ISaveManager> saveManagers;
private FileDataHandler dataHandler;
[ContextMenu("删除保存的存档")]
private void DeleteSavaData()
{
dataHandler = new FileDataHandler(Application.persistentDataPath, fileName);
dataHandler.Delete();
}
private void Awake()
{
if (instance != null)
Destroy(instance.gameObject);
else
instance = this;
}
private void Start()
{
dataHandler = new FileDataHandler(Application.persistentDataPath, fileName);
saveManagers = FindAllSaveManagers(); //获取所有SaveManager
LoadGame();
}
public void NewGame()
{
gameData = new GameData();
}
public void LoadGame()
{
//加载存档
//从本地获取存档
gameData = dataHandler.Load();
//新游戏创建新存档
if (this.gameData == null)
{
Debug.Log("未找到游戏存档");
NewGame();
}
//循环调用所有找到的接口的LoadData
foreach (ISaveManager saveManager in saveManagers)
{
saveManager.LoadData(gameData);
}
}
public void SaveGame()
{
//保存存档
//循环调用所有找到的接口的SaveGame
foreach (ISaveManager saveManager in saveManagers)
{
saveManager.SaveData(ref gameData);
}
//将存档保存到本地
dataHandler.Save(gameData);
}
private void OnApplicationQuit()
{
SaveGame();
}
private List<ISaveManager> FindAllSaveManagers()
{
//获取游戏内所有SaveManager
IEnumerable<ISaveManager> saveManagers = FindObjectsOfType<MonoBehaviour>(true).OfType<ISaveManager>();
return new List<ISaveManager>(saveManagers);
}
}