NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Unit/GameUnitManager.cs

237 lines
7.7 KiB
C#
Raw Normal View History

2023-12-14 14:42:27 +08:00
using System;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using Framework;
using Gameplay.Character;
using Gameplay.Character.Utils;
using Gameplay.Level;
using Gameplay.Unit.Data;
using Gameplay.Vehicle.Impl;
namespace Gameplay.Unit
{
public class GameUnitManager
{
/// <summary>
/// 备战席的单位
/// </summary>
public UnitContainer prepareUnits = new UnitContainer();
/// <summary>
/// 战斗中的单位
/// </summary>
public UnitContainer infightUnits = new UnitContainer();
/// <summary>
/// 已死亡的单位
/// 注意这里不会有载具单位,载具单位死亡之后仍在存在于战斗中,只是处于损坏状态,可以被技能修复
/// </summary>
public UnitContainer deadUnits = new UnitContainer();
/// <summary>
/// 所有的单位,无论是否在备战席、战斗中、死亡,都能在这里找到
/// </summary>
public UnitContainer totalUnits = new UnitContainer();
public CharacterManager characterManager;
private bool _needUpdateTargets;
public static GameUnitManager instance { get; private set; }
public static void CreateInstance()
{
instance = new GameUnitManager();
instance.Init();
}
private GameUnitManager()
{
characterManager = new CharacterManager();
}
public void Init()
{
_needUpdateTargets = true;
_RegistEvents();
}
private void _RegistEvents()
{
EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_CELLINDEX_CHANGE, (Action<GameUnit>)_OnAnyCharacterCellIndexChange);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_UP_VEHICLE, (Action<GameUnit>)_OnAnyCharacterCellIndexChange);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_DOWN_VEHICLE, (Action<GameUnit>)_OnAnyCharacterCellIndexChange);
EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_DEAD, (Action<GameUnit>)_OnCharacterDead);
}
private void _UnRegistEvents()
{
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_CELLINDEX_CHANGE, (Action<GameUnit>)_OnAnyCharacterCellIndexChange);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UP_VEHICLE, (Action<GameUnit>)_OnAnyCharacterCellIndexChange);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_DOWN_VEHICLE, (Action<GameUnit>)_OnAnyCharacterCellIndexChange);
EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_DEAD, (Action<GameUnit>)_OnCharacterDead);
}
private void _OnCharacterDead(GameUnit deadCharacter)
{
_needUpdateTargets = true;
}
private void _OnAnyCharacterCellIndexChange(GameUnit noUse)
{
_needUpdateTargets = true;
}
public async UniTask PrepareUnits()
{
var selectTeam = TeamEditManager.Instance.GetSelectTeam();
var cIds = selectTeam.GetCharacterIDs();
for (int i = 0; i < cIds.Length; i++)
{
var cId = cIds[i];
var cInfo = CharacterDataInfoManager.Instance.GetCharacterInfo(cId);
if (cInfo == null)
{
DebugUtil.LogError("不存在的角色id: {0}", cId);
continue;
}
}
var vIds = selectTeam.GetVehicleIDs();
for (int i = 0; i < vIds.Length; i++)
{
var vId = vIds[i];
var vInfo = VehicleCultivateDataManager.Instance.GetVehicleCultivateData(vId);
if (vInfo == null)
{
DebugUtil.LogError("不存在的载具id: {0}", vId);
continue;
}
var nGuid = GUIDManager.GenGuid();
var dataConfig = VehicleDataHelper.CombineConfigData(vInfo);
var troopId = ETroopsId.Self;
var createUnit = new NormalVehicle(nGuid, dataConfig, troopId);
await createUnit.Create();
prepareUnits.Add(createUnit);
totalUnits.Add(createUnit);
}
}
public async UniTask<GameUnit> PrepareNpc(LevelData.NPCInfo npcInfo,
int troopId)
{
var nGuid = GUIDManager.GenGuid();
var dataConfig = CharacterDataHelper.CombineConfigData(npcInfo.id, npcInfo.level);
var createUnit = new Character.Character(nGuid, dataConfig, troopId);
await createUnit.LoadAsync();
prepareUnits.Add(createUnit);
totalUnits.Add(createUnit);
return createUnit;
}
public async UniTask<GameUnit> PrepareCharacter(CharacterDataInfo cInfo,
int troopId)
{
var nGuid = GUIDManager.GenGuid();
var dataConfig = CharacterDataHelper.CombineConfigData(cInfo);
var createUnit = new Character.Character(nGuid, dataConfig, troopId);
await createUnit.LoadAsync();
prepareUnits.Add(createUnit);
totalUnits.Add(createUnit);
return createUnit;
}
// 将单位移动到备战席
public void MoveUnitToPrepare(uint unitGuid)
{
var unit = infightUnits.Search(unitGuid);
if (unit == null)
{
DebugUtil.LogError("不存在的单位:{0}", unitGuid);
return;
}
// 判断是否已经开展
if (LevelManager.Instance.CurrentLevel.isInBattle)
{
unit.ExitBattle();
}
unit.BackPrepare();
// 转移
infightUnits.Remove(unit);
prepareUnits.Add(unit);
}
// 将到位移动到战斗中,并指定位置
public void MoveUnitToFight(uint unitGuid,
int cellIndex,
float yaw)
{
var unit = prepareUnits.Search(unitGuid);
if (unit == null)
{
DebugUtil.LogError("不存在的单位:{0}", unitGuid);
return;
}
// 设置位置
unit.SetPosAndYaw(cellIndex, yaw);
unit.Ready();
// 判断是否已经开战
if (LevelManager.Instance.CurrentLevel.isInBattle)
{
unit.EnterBattle();
}
// 转移
prepareUnits.Remove(unit);
infightUnits.Add(unit);
}
public void EnterBattle()
{
for (int i = 0; i < infightUnits.count; i++)
{
var unit = infightUnits.GetByIndex(i);
unit.EnterBattle();
}
}
public void LogicUpdate(float dt)
{
if (_needUpdateTargets)
{
_needUpdateTargets = false;
_UpdateTargets();
}
for (int i = 0; i < infightUnits.count; i++)
{
var unit = infightUnits.GetByIndex(i);
unit.LogicUpdate(dt);
if (unit.needRemove)
{
unit.ExitBattle();
infightUnits.RemoveAt(i);
deadUnits.Add(unit);
i--;
}
}
}
private void _UpdateTargets()
{
characterManager.UpdateTargets();
}
public void Dispose()
{
_UnRegistEvents();
characterManager.Dispose();
instance = null;
}
}
}