Unity类银河战士恶魔城学习总结(P148 Main Menu主菜单)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/
开始了新的章节,主菜单的制作
UI_MainMenu.cs
负责实现游戏主菜单的逻辑,包括新游戏、继续游戏和退出游戏三个功能。
Start
方法
- 触发时机:在游戏运行时初始化,通常用来设置初始状态。
- 核心逻辑:
- 检查存档:通过
SaveManager.instance.HasSavedData()
检查是否有存档。 - 动态调整 UI:如果没有存档,则隐藏继续游戏按钮(通过
SetActive(false)
控制其不可见)。
- 检查存档:通过
- 依赖性:
- 依赖
SaveManager
单例,假设SaveManager
提供了HasSavedData()
方法来判断存档存在
- 依赖
ContinueGame
方法
- 触发时机:点击“继续游戏”按钮时调用。
- 核心逻辑:
- 加载场景:使用
SceneManager.LoadScene
切换到指定的游戏场景(sceneName
)。 - 前提条件:只有当
continueButton
显示时(即有存档)才会触发该方法。
- 加载场景:使用
NewGame
方法
- 触发时机:点击“新游戏”按钮时调用。
- 核心逻辑:
- 删除存档:调用
SaveManager.instance.DeleteSaveData()
清除现有的游戏存档。 - 加载场景:重置游戏状态并加载目标场景(
sceneName
)。
- 删除存档:调用
- 目的:确保新游戏从初始状态开始。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
//2024.11.27到冬天了
public class UI_MainMenu : MonoBehaviour
{
[SerializeField] private string sceneName = "MainScene";
[SerializeField] private GameObject continueButton;
private void Start()
{
if (SaveManager.instance.HasSavedData() == false) //如果没有存档
continueButton.SetActive(false);//不显示继续游戏按钮
}
public void ContinueGame()
{
SceneManager.LoadScene(sceneName);
}
public void NewGame()
{
SaveManager.instance.DeleteSaveData();
SceneManager.LoadScene(sceneName);
}
public void ExitGame()
{
Debug.Log("退出游戏");
}
}
SaveManager.cs
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;
[SerializeField] private bool encryptData;
private GameData gameData;
private List<ISaveManager> saveManagers = new List<ISaveManager>();
private FileDataHandler dataHandler;
[ContextMenu("Delete save file")]
public void DeleteSaveData()
{
dataHandler = new FileDataHandler(Application.persistentDataPath, fileName, encryptData);
dataHandler.Delete();
}
private void Awake()
{
if (instance != null)
Destroy(instance.gameObject);
else
instance = this;
}
private void Start()
{
dataHandler = new FileDataHandler(Application.persistentDataPath, fileName, encryptData);
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>(true).OfType<ISaveManager>();
return new List<ISaveManager>(saveManagers);
}
public bool HasSavedData()
{
if (dataHandler.Load() != null)
{
return true;
}
return false;
}
}