203 lines
6.0 KiB
C#
203 lines
6.0 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Globalization;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using AibisDream.FixSystem;
|
|
using AibisDream.Framework;
|
|
using AibisDream.Kit;
|
|
using AibisDream.Utility;
|
|
using Newtonsoft.Json.Linq;
|
|
using UnityEngine;
|
|
using Yarn.Unity;
|
|
|
|
namespace AibisDream
|
|
{
|
|
public class GameLoopManager : Singleton<GameLoopManager>
|
|
{
|
|
private const int MaxSaveNum = 200;
|
|
private static readonly string SaveFilePath = Application.streamingAssetsPath + "/SaveFiles";
|
|
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.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.StartDialog(_currentTalkSceneSo.Value.yarnProject);
|
|
}
|
|
|
|
#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;
|
|
}
|
|
}
|
|
} |