186 lines
6.2 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
}
|