本章节制作了主菜单继续游戏、开始新游戏功能
源代码
UI_MainMenu.cs
using UnityEngine;
using UnityEngine.SceneManagement;
public class UI_MainMenu : MonoBehaviour
{
[SerializeField] private string sceneName = "MainScene"; //加载场景名称
[SerializeField] private GameObject continueButton;
private void Start()
{
//若开始时未找到存档,则将继续游戏按钮隐藏
if (!SaveManager.instance.HasSaveData())
continueButton.SetActive(false);
}
//继续游戏
public void ContinueGame()
{
SceneManager.LoadScene(sceneName);
}
//创建新游戏
public void NewGame()
{
SaveManager.instance.DeleteSavaData();
SceneManager.LoadScene(sceneName);
}
//退出
public void ExitGame()
{
Application.Quit();
}
}
SaveManager.cs
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class SaveManager : MonoBehaviour
{
public static SaveManager instance;
[SerializeField] private string fileName;
[SerializeField] private bool encrypt;
private GameData gameData;
private List<ISaveManager> saveManagers;
private FileDataHandler dataHandler;
[ContextMenu("删除保存的存档")]
public void DeleteSavaData()
{
dataHandler = new FileDataHandler(Application.persistentDataPath, fileName, encrypt);
dataHandler.Delete();
}
private void Awake()
{
if (instance != null)
Destroy(instance.gameObject);
else
instance = this;
}
private void Start()
{
dataHandler = new FileDataHandler(Application.persistentDataPath, fileName, encrypt);
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);
}
public bool HasSaveData()
{
if(dataHandler.Load() != null)
return true;
return false;
}
}