Unity类银河战士恶魔城学习总结(P148 Main Menu主菜单)

发布于:2024-11-29 ⋅ 阅读:(33) ⋅ 点赞:(0)

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

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

开始了新的章节,主菜单的制作

UI_MainMenu.cs

负责实现游戏主菜单的逻辑,包括新游戏继续游戏退出游戏三个功能。

Start 方法

  • 触发时机:在游戏运行时初始化,通常用来设置初始状态。
  • 核心逻辑
    1. 检查存档:通过 SaveManager.instance.HasSavedData() 检查是否有存档。
    2. 动态调整 UI:如果没有存档,则隐藏继续游戏按钮(通过 SetActive(false) 控制其不可见)。
  • 依赖性
    • 依赖 SaveManager 单例,假设 SaveManager 提供了 HasSavedData() 方法来判断存档存在

ContinueGame 方法

  • 触发时机:点击“继续游戏”按钮时调用。
  • 核心逻辑
    1. 加载场景:使用 SceneManager.LoadScene 切换到指定的游戏场景(sceneName)。
    2. 前提条件:只有当 continueButton 显示时(即有存档)才会触发该方法。

NewGame 方法

  • 触发时机:点击“新游戏”按钮时调用。
  • 核心逻辑
    1. 删除存档:调用 SaveManager.instance.DeleteSaveData() 清除现有的游戏存档。
    2. 加载场景:重置游戏状态并加载目标场景(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;
    }
}