using System; using System.Collections; using AibisDream.Framework; using AibisDream.Kit; using UnityEngine; using Yarn.Unity; namespace AibisDream { public class GameLoopManager : Singleton { 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 _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(); _currentTalkSceneSo.Register(item => _data.curSceneSoName = item.name); } private IEnumerator LoadClinicOut() { yield return SceneLoader.Instance.LoadSceneAsync("ClinicOut"); // FindObjectOfType().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); } #region 重新开始游戏功能 /// /// 重新开始游戏,重新加载当前场景 /// 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; } } }