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#
		
	
| 
											2 years ago
										 | 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); | ||
|  |         } | ||
|  |     } | ||
|  | } |