Files
aibis-dream/Assets/Scripts/Game Loop/GameLoopManager.cs
T
2025-03-26 17:22:40 +08:00

200 lines
5.8 KiB
C#

using System;
using System.Collections;
using AibisDream.Framework;
using AibisDream.Kit;
using UnityEngine;
using Yarn.Unity;
namespace AibisDream
{
public class GameLoopManager : Singleton<GameLoopManager>
{
private static readonly string TestSaveFilePath = Application.streamingAssetsPath + "/TestSaveFiles";
#region 运行模式相关
[Header("可用so合集")] public TalkSceneSO[] totalSceneSos;
public RunMode runMode;
[Header("生产环境数据(一般不动)")] public TalkSceneSO firstTalkSo;
[Header("单场景测试")] public TalkSceneSO testTalkSo;
[Header("存档测试")] public string saveFileName;
#endregion
private BindProperty<TalkSceneSO> _currentTalkSceneSo;
private GameLoopData _data = new();
public void Start()
{
// 先注册
Register();
// 加载其他部分
#if UNITY_EDITOR
if (runMode == RunMode.SingleScene)
{
StartMenu.Instance.HideStartMenu();
StartSingleSceneTest();
}
else if (runMode == RunMode.SaveFile)
{
// MainUIController.Instance.TVFadeOut(1);
StartMenu.Instance.HideStartMenu();
LoadSaveFile($"{TestSaveFilePath}/{saveFileName}");
}
else
{
StartCoroutine(LoadClinicOut());
}
#else
StartCoroutine(LoadClinicOut());
runMode = RunMode.Product;
#endif
}
private void Register()
{
// 数据类注册
StorageSystem.Instance.RegisterData(_data);
// 场景So事件注册
_currentTalkSceneSo = new BindProperty<TalkSceneSO>();
_currentTalkSceneSo.Register(item => _data.curSceneSoName = item.name);
}
private IEnumerator LoadClinicOut()
{
yield return SceneLoader.Instance.LoadSceneAsync("ClinicOut");
// FindObjectOfType<EnvironmentManager>().SetTimeOfDayCommand("day");
}
public void StartWithTalkSceneSO(TalkSceneSO sceneSO)
{
_currentTalkSceneSo.Value = sceneSO;
StartCoroutine(LoadScene());
}
public void StartWithSaveFile(string saveFileName)
{
StartMenu.Instance.HideStartMenu();
LoadSaveFile(saveFileName);
}
private void LoadSaveFile(string savePath)
{
StorageSystem.Instance.Load(savePath);
}
public void StartNewGame()
{
_currentTalkSceneSo.Value = firstTalkSo;
StartCoroutine(LoadClinicScene());
}
private void StartSingleSceneTest()
{
_currentTalkSceneSo.Value = testTalkSo;
StartCoroutine(LoadClinicScene());
}
private IEnumerator LoadClinicScene()
{
yield return SceneLoader.Instance.LoadSceneAsync(_currentTalkSceneSo.Value.firstSceneName);
StartMenu.Instance.HideStartMenu();
DialogController.Instance.StartDialog(_currentTalkSceneSo.Value.yarnProject);
}
private IEnumerator LoadScene()
{
yield return SceneLoader.Instance.LoadSceneAsync(_currentTalkSceneSo.Value.firstSceneName);
StartMenu.Instance.HideStartMenu();
DialogController.Instance.StartDialog(_currentTalkSceneSo.Value.yarnProject);
}
public IEnumerator NextSceneSo()
{
if (_currentTalkSceneSo.Value && _currentTalkSceneSo.Value.nextScene)
{
_currentTalkSceneSo.Value = _currentTalkSceneSo.Value.nextScene;
yield return MainUIController.Instance.FadeInSync(1);
yield return LoadClinicScene();
// yield return MainUIController.Instance.FadeOutSync(1);
}
else
{
yield return null;
Debug.Log("没有下个场景了");
}
}
public void SetSceneSoByName(string soName)
{
_currentTalkSceneSo.Value = Array.Find(totalSceneSos, so => so.name == soName);
}
public void StartDialog()
{
DialogController.Instance.LoadDialog(_currentTalkSceneSo.Value.yarnProject);
}
public string GetSceneSoName()
{
return _currentTalkSceneSo.Value.name;
}
#region 重新开始游戏功能
/// <summary>
/// 重新开始游戏,重新加载当前场景
/// </summary>
public void RestartGame()
{
// 确保场景正在加载或卸载前,先重置相关状态
StartCoroutine(RestartGameCoroutine());
}
private IEnumerator RestartGameCoroutine()
{
yield return SceneLoader.Instance.UnloadSceneAsync();
yield return MainUIController.Instance.FadeInSync(1);
yield return LoadClinicOut();
MainUIController.Instance.ShowMainUI();
StartMenu.Instance.showStartMenu();
StartMenu.Instance.HideEndMenu();
yield return MainUIController.Instance.FadeOutSync(1);
}
#endregion
}
public enum RunMode
{
Product,
SingleScene,
SaveFile
}
public static class GameLoopYarnCommand
{
[YarnCommand("auto_save")]
public static void AutoSave()
{
StorageSystem.Instance.Save();
}
}
[Serializable]
[LoadIndex(10)]
public class GameLoopData : IData
{
public string curSceneSoName;
public IEnumerator Load()
{
GameLoopManager.Instance.SetSceneSoByName(curSceneSoName);
GameLoopManager.Instance.StartDialog();
yield break;
}
}
}