You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			213 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			213 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C#
		
	
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| using Articy.Touhou;
 | |
| 
 | |
| /// <summary>
 | |
| /// 关卡池化管理
 | |
| /// </summary>
 | |
| namespace Game
 | |
| {
 | |
|     public enum ELevelType
 | |
|     {
 | |
|         Home,
 | |
|         Battle,
 | |
|         BattleElite,
 | |
|         BattleBoss,
 | |
|         BattleBigBoss,
 | |
|         BattleFinalBoss,
 | |
|         Store,
 | |
|         Treasure,
 | |
|         Money,
 | |
|         Random,
 | |
|         Drama,
 | |
|         Rest,
 | |
|         None = 99,
 | |
| 
 | |
|     }
 | |
|     public class LevelPoolManager : ObjectPoolBase<LevelPoolManager>
 | |
|     {
 | |
|         private readonly string _mLevelPath = "Level/";
 | |
|         private LevelPoolItem _mCurLevel;
 | |
|         private List<string> _mFinishedLevel = new List<string>();
 | |
|         private float _mLoadingTimeLeft;
 | |
|         private Dictionary<ELevelType, string> _mDoorTypeDict = new Dictionary<ELevelType, string>();//关卡类型对应门的实体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<LevelPoolItem>($"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<string> 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<string> 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);
 | |
|         }
 | |
|     }
 | |
| } |