NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Vehicle/VehicleManager.cs

204 lines
6.6 KiB
C#

using System;
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using Framework;
using Gameplay.Buff;
using Gameplay.Common;
using Gameplay.Skill;
using Gameplay.Vehicle.Data;
using Gameplay.Vehicle.Impl;
namespace Gameplay.Vehicle
{
public class VehicleManager
{
private static VehicleManager _instance;
public static VehicleManager Inst
{
get
{
return _instance;
}
}
public static VehicleManager CreateInstance()
{
if (_instance != null)
{
DebugUtil.LogError("请勿重复创建VehicleManager");
return _instance;
}
_instance = new VehicleManager();
return _instance;
}
private readonly List<PreviewVehicle> _preCreateVehicles = new List<PreviewVehicle>();
private readonly List<NormalVehicle> _vehicles = new List<NormalVehicle>();
private bool _needRefreshTargets = false;
private VehicleManager()
{
}
public async UniTask InitForBattle()
{
// 把所有的预创建的vehicle都创建出来
for (int i = 0; i < _preCreateVehicles.Count; i++)
{
var pVehicle = _preCreateVehicles[i];
GameUnitMapper.Inst.RemoveUnitById(pVehicle.GetID());
var vehicle = new NormalVehicle(pVehicle);
await vehicle.ReInit();
_AddVehicle(vehicle);
}
_preCreateVehicles.Clear();
_needRefreshTargets = true;
_RegistEvents();
}
private void _AddVehicle(NormalVehicle vehicle)
{
_vehicles.Add(vehicle);
}
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)
{
_needRefreshTargets = true;
}
private void _OnAnyCharacterCellIndexChange(GameUnit noUse)
{
_needRefreshTargets = true;
}
private void _UpdateTargets()
{
for (int i = 0; i < _vehicles.Count; i++)
{
var vehicle = _vehicles[i];
if (SkillManager.instance.needSkillPaused && SkillManager.instance.skillingUnit != vehicle)
{
continue;
}
vehicle.UpdateTargets();
}
}
public void Dispose()
{
_UnRegistEvents();
_instance = null;
}
public void PreviewUpdate(float dt)
{
for (int i = 0; i < _preCreateVehicles.Count; i++)
{
var vehicle = _preCreateVehicles[i];
vehicle.PreviewUpdate(dt);
}
}
public void LogicUpdate(float dt)
{
if (_needRefreshTargets)
{
_needRefreshTargets = true;
_UpdateTargets();
}
for (int i = 0; i < _vehicles.Count; i++)
{
var vehicle = _vehicles[i];
if (SkillManager.instance.needSkillPaused && SkillManager.instance.skillingUnit != vehicle)
{
continue;
}
vehicle.LogicUpdate(dt);
}
}
/// <summary>
/// 非战斗状态下创建vehicle
/// </summary>
/// <param name="uid"></param>
/// <param name="vehicleId"></param>
/// <param name="skillLevel"></param>
/// <param name="troopId"></param>
/// <returns></returns>
public PreviewVehicle CreateVehicleForPreview(uint uid, int vehicleId,
int skillLevel,
int troopId)
{
var uuId = uid;
var configData = _CreateConfigData(vehicleId, 1, skillLevel);
var vehicle = new PreviewVehicle(uuId, configData, troopId);
_ = vehicle.Create();
_preCreateVehicles.Add(vehicle);
return vehicle;
}
public async UniTask<BaseVehicle> CreateVehicle(uint uid, int vehicleId,
int skillLevel,
int troopId)
{
var uuId = uid;
var configData = _CreateConfigData(vehicleId, 1, skillLevel);
var vehicle = new NormalVehicle(uuId, configData, troopId);
await vehicle.CreateAndReady();
_AddVehicle(vehicle);
return vehicle;
}
public void RemoveVehicleForPreview(PreviewVehicle vehicle)
{
EventManager.Instance.Send(EventManager.EventName.INFIGHT_UNIT_DEAD, vehicle);
EventManager.Instance.Send(EventManager.EventName.INFIGHT_UNIT_REMOVE, vehicle);
vehicle.Dispose();
_preCreateVehicles.Remove(vehicle);
}
private static VehicleConfigData _CreateConfigData(int vehicleId, int level, int skillLevel)
{
var rawConfig = TableManager.Instance.Tables.VehicleConfig.Get(vehicleId);
if (rawConfig == null)
{
DebugUtil.LogError("找不到vehicleId对应的配置: {0}", vehicleId);
return null;
}
var configData = new VehicleConfigData();
configData.Init(rawConfig, level, skillLevel);
return configData;
}
}
}