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