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();
}
}
}