NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Fight/Evacuate/EvacuateManager.cs

186 lines
6.2 KiB
C#

using System.Collections.Generic;
using Framework;
using Gameplay.Character;
using Gameplay.Level;
using Gameplay.Unit;
using Gameplay.Vehicle.Impl;
using UnityEngine;
namespace Code.Scripts.Gameplay.Fight.Evacuate
{
public class EvacuateManager
{
public static EvacuateManager instance { get; private set; }
public static void CreateInstance()
{
instance = new EvacuateManager();
}
private List<EvacuatePoint> _evacuatePoints = new List<EvacuatePoint>();
private Dictionary<int, EvacuatePoint> _evacuatePointDict = new Dictionary<int, EvacuatePoint>();
private GameObject _rootObj;
private bool _needUpdate;
private EvacuateManager()
{
}
public void Init()
{
_rootObj = new GameObject("[EvacuateManager]");
_CreateEvacuatePoints();
for (int i = 0; i < _evacuatePoints.Count; i++)
{
var point = _evacuatePoints[i];
point.Init(_rootObj.transform);
}
_RegisterEvents();
}
private void _RegisterEvents()
{
EventManager.Instance.Register<GameUnit>(EventManager.EventName.INFIGHT_UNIT_CELLINDEX_CHANGE, _OnEventChange);
EventManager.Instance.Register<GameUnit>(EventManager.EventName.INFIGHT_UP_VEHICLE, _OnEventChange);
EventManager.Instance.Register<GameUnit>(EventManager.EventName.INFIGHT_DOWN_VEHICLE, _OnEventChange);
EventManager.Instance.Register<GameUnit>(EventManager.EventName.INFIGHT_UI_EVACUATE_UNIT, _OnEventEvacuateUnit);
}
private void _UnRegisterEvents()
{
EventManager.Instance.Unregister<GameUnit>(EventManager.EventName.INFIGHT_UNIT_CELLINDEX_CHANGE, _OnEventChange);
EventManager.Instance.Unregister<GameUnit>(EventManager.EventName.INFIGHT_UP_VEHICLE, _OnEventChange);
EventManager.Instance.Unregister<GameUnit>(EventManager.EventName.INFIGHT_DOWN_VEHICLE, _OnEventChange);
EventManager.Instance.Unregister<GameUnit>(EventManager.EventName.INFIGHT_UI_EVACUATE_UNIT, _OnEventEvacuateUnit);
}
private void _OnEventEvacuateUnit(GameUnit unit)
{
if (unit.unitUIData.standEvacuatePoint == null)
{
DebugUtil.LogError("撤离错误,没有撤离点");
return;
}
if (unit.unitUIData.standEvacuatePoint.cellIndex != unit.transData.cellIndex)
{
DebugUtil.LogError("撤离错误,不在撤离点");
return;
}
if (unit is NormalVehicle vehicle)
{
if (vehicle.containsUnits.Count > 0)
{
DebugUtil.LogError("撤离错误,载具内有单位");
return;
}
}
var standEvacuatePoint = unit.unitUIData.standEvacuatePoint;
unit.unitUIData.standEvacuatePoint = null;
unit.EvacuateFromFight();
if (standEvacuatePoint.evacuateCount == 1)
{
// 一次性撤离点
_evacuatePoints.Remove(standEvacuatePoint);
_evacuatePointDict.Remove(standEvacuatePoint.cellIndex);
standEvacuatePoint.Dispose();
}
}
private void _OnEventChange(GameUnit unit)
{
if (unit.commonData.troopId != ETroopsId.Self) return;
if (!unit.commonData.canControl) return;
_needUpdate = true;
}
private void _CreateEvacuatePoints()
{
var levelData = LevelManager.Instance.CurrentLevel.GetLevelData();
var onceEvacuatePoints = levelData.fallbackSinglePoints;
var alwaysEvacuatePoints = levelData.fallbackReusablePoints;
if (onceEvacuatePoints != null)
{
for (int i = 0; i < onceEvacuatePoints.Count; i++)
{
var cellIndex = onceEvacuatePoints[i];
_AddPoint(cellIndex, 1);
}
}
if (alwaysEvacuatePoints != null)
{
for (int i = 0; i < alwaysEvacuatePoints.Count; i++)
{
var cellIndex = alwaysEvacuatePoints[i];
_AddPoint(cellIndex, -1);
}
}
}
private void _AddPoint(int cellIndex, int evacuateCount)
{
var newPoint = new EvacuatePoint(cellIndex, evacuateCount);
_evacuatePoints.Add(newPoint);
_evacuatePointDict.Add(cellIndex, newPoint);
}
public void LogicUpdate()
{
if (_needUpdate)
{
_needUpdate = false;
var allUnits = GameUnitManager.instance.infightUnits.GetListByTroop(ETroopsId.Self);
for (int i = 0; i < allUnits.Count; i++)
{
var unit = allUnits[i];
if (unit.statusData.isOnVehicle)
{
unit.unitUIData.standEvacuatePoint = null;
continue;
}
if (unit.statusData.isDead)
{
unit.unitUIData.standEvacuatePoint = null;
continue;
}
var cellIndex = unit.transData.cellIndex;
if (_evacuatePointDict.TryGetValue(cellIndex, out var point))
{
unit.unitUIData.standEvacuatePoint = point;
}
}
}
}
public void Dispose()
{
_UnRegisterEvents();
for (int i = 0; i < _evacuatePoints.Count; i++)
{
var point = _evacuatePoints[i];
point.Dispose();
}
_evacuatePoints.Clear();
_evacuatePointDict.Clear();
Object.Destroy(_rootObj);
_rootObj = null;
}
}
}