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 const string LevelPath = "Level/"; private LevelPoolItem _curLevel; private readonly List _finishedLevel = new List(); private float _loadingTimeLeft; private readonly Dictionary _doorTypeDict = new Dictionary(); //关卡类型对应门的实体id public override void Update() { if (_loadingTimeLeft == 0) { return; } _loadingTimeLeft -= Time.deltaTime; if (_loadingTimeLeft <= 0) { _loadingTimeLeft = 0; Loading(false); } } public override void OnDestroy() { } public void EnterLevel(string levelId) { if (string.IsNullOrEmpty(levelId)) { Util.Print("关卡id为空"); return; } if (_curLevel != null) { _curLevel.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(_curLevel == null ? "" : _curLevel.CfgId); _finishedLevel.Add(levelNew.CfgId); _curLevel = levelNew; _curLevel.CreateLevel(); } public GameObject CreateLevelGo(string levelId) { var path = $"{LevelPath}{levelId.ToString()}"; var go = PrefabManager.Instance.CreateGo(path); go.transform.parent = Root.transform; return go; } private void Loading(bool isLoading) { if (isLoading) { _loadingTimeLeft = 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; _doorTypeDict[(ELevelType)cfg.LevelType] = item.TechnicalName; } } public string GetDoorId(ELevelType levelType) { if (!_doorTypeDict.ContainsKey(levelType)) { Util.Print("无该类型的传送门:", levelType); return ""; } return _doorTypeDict[levelType]; } public LevelPoolItem GetCurLevel() { return _curLevel; } public ILevelMonsterWave GetCurWave() { return _curLevel.CurWave ? _curLevel.CurWave : LevelNodeMonsterWave.Default; } public bool IsLevelLoading() { return _loadingTimeLeft > 0; } public List GetFinishedLevel() { return _finishedLevel; } public int GetDifficulty() { return _curLevel.Cfg.Difficulty; } } } 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 ILevelMonsterWave 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(); } } }