using System.Collections.Generic; using UnityEngine; using Articy.Touhou; /// /// 关卡池化管理 /// namespace Game { public enum ELevelType { Home, Battle, BattleElite, BattleBoss, BattleBigBoss, BattleFinalBoss, Store, Treasure, Money, Random, Drama, Rest, None = 99, } public class LevelPoolManager : ObjectPoolBase { private readonly string _mLevelPath = "Level/"; private LevelPoolItem _mCurLevel; private List _mFinishedLevel = new List(); private float _mLoadingTimeLeft; private Dictionary _mDoorTypeDict = new Dictionary();//关卡类型对应门的实体id private bool _isAIDirectorInit = false; public override void Update() { if (_mLoadingTimeLeft == 0) { return; } _mLoadingTimeLeft -= Time.deltaTime; if (_mLoadingTimeLeft <= 0) { _mLoadingTimeLeft = 0; Loading(false); } } public override void OnDestroy() { } public void EnterLevel(string levelId) { if (string.IsNullOrEmpty(levelId)) { Util.Print("关卡id为空"); return; } if (_mCurLevel != null) { _mCurLevel.Destroy(); } EnterLevelReal(levelId); } private void EnterLevelReal(string levelId) { Loading(true); var levelNew = Create($"Level{levelId.ToString()}", (item) => { var cfg = Util.GetConfig(levelId); if (!(cfg is Level)) { Util.Print("关卡id错误:", levelId); return; } var cfgLevel = cfg as Level; item.CfgId = cfg.TechnicalName; item.Cfg = cfgLevel.GetFeatureLevel(); item.Init(); }); levelNew.SetPlayerBorn(_mCurLevel == null ? "" : _mCurLevel.CfgId); _mFinishedLevel.Add(levelNew.CfgId); _mCurLevel = levelNew; _mCurLevel.CreateLevel(); } public GameObject CreateLevelGo(string levelId) { var path = $"{_mLevelPath}{levelId.ToString()}"; var go = PrefabManager.Instance.CreateGo(path); go.transform.parent = Root.transform; return go; } private void Loading(bool isLoading) { if (isLoading) { _mLoadingTimeLeft = GameConst.LoadingMinTime; UIManager.Instance.OpenInNew(EuiPage.Loading); } else { UIManager.Instance.OpenInNew(EuiPage.Hud); // TODO 显示关卡名称 // string levelName = m_CurLevel.m_LevelNode.Text; // if (!string.IsNullOrEmpty(levelName)) // { // EventManager.instance.SendEvent(EEvent.ShowLevelName, levelName); // } } } private void LoadDoorTypeDict() { var cfgs = Util.GetDoorConfigDataAll(); foreach (var item in cfgs) { var cfg = item.Template.Door; _mDoorTypeDict[(ELevelType)cfg.LevelType] = item.TechnicalName; } } public string GetDoorId(ELevelType levelType) { if (!_mDoorTypeDict.ContainsKey(levelType)) { Util.Print("无该类型的传送门:", levelType); return ""; } return _mDoorTypeDict[levelType]; } public LevelPoolItem GetCurLevel() { return _mCurLevel; } public LevelNodeMonsterWave GetCurWave() { return _mCurLevel.CurWave; } public bool IsLevelLoading() { return _mLoadingTimeLeft > 0; } public List GetFinishedLevel() { return _mFinishedLevel; } public int GetDifficulty() { return _mCurLevel.Cfg.Difficulty; } public bool GetAIDirectorInit() { return _isAIDirectorInit; } public void SetAIDirectorInit() { _isAIDirectorInit = true; } public int GetModuleNum(EAIModuleType type) { if (_mCurLevel == null) { return 0; } if (_mCurLevel.CurWave == null) { return 0; } return _mCurLevel.CurWave.GetModuleNum(type); } } } namespace Game { public abstract partial class Util { public static void EnterLevel(string levelId) { LevelPoolManager.Instance.EnterLevel(levelId); } public static LevelPoolItem GetCurLevel() { return LevelPoolManager.Instance.GetCurLevel(); } public static LevelNodeMonsterWave GetCurWave() { return LevelPoolManager.Instance.GetCurWave(); } public static int GetDifficulty() { return LevelPoolManager.Instance.GetDifficulty(); } public static bool IsLevelLoading() { return LevelPoolManager.Instance.IsLevelLoading(); } public static List GetFinishedLevel() { return LevelPoolManager.Instance.GetFinishedLevel(); } public static bool GetAIDirectorInit() { return LevelPoolManager.Instance.GetAIDirectorInit(); } public static void SetAIDirectorInit() { LevelPoolManager.Instance.SetAIDirectorInit(); } public static int GetModuleNum(EAIModuleType type) { return LevelPoolManager.Instance.GetModuleNum(type); } } }