200 lines
6.4 KiB
C#
200 lines
6.4 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);
|
|
|
|
BuffManager.instance.InitVehicle(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];
|
|
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 (SkillManager.instance.needSkillPaused)
|
|
{
|
|
return;
|
|
}
|
|
if (_needRefreshTargets)
|
|
{
|
|
_needRefreshTargets = true;
|
|
_UpdateTargets();
|
|
}
|
|
for (int i = 0; i < _vehicles.Count; i++)
|
|
{
|
|
var vehicle = _vehicles[i];
|
|
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;
|
|
}
|
|
|
|
}
|
|
}
|