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 _preCreateVehicles = new List(); private readonly List _vehicles = new List(); 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)_OnAnyCharacterCellIndexChange); EventManager.Instance.Register(EventManager.EventName.INFIGHT_UP_VEHICLE, (Action)_OnAnyCharacterCellIndexChange); EventManager.Instance.Register(EventManager.EventName.INFIGHT_DOWN_VEHICLE, (Action)_OnAnyCharacterCellIndexChange); EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_DEAD, (Action)_OnCharacterDead); } private void _UnRegistEvents() { EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_CELLINDEX_CHANGE, (Action)_OnAnyCharacterCellIndexChange); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UP_VEHICLE, (Action)_OnAnyCharacterCellIndexChange); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_DOWN_VEHICLE, (Action)_OnAnyCharacterCellIndexChange); EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_DEAD, (Action)_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); } } /// /// 非战斗状态下创建vehicle /// /// /// /// /// /// 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 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; } } }