using System.Collections.Generic; using Gameplay.Level; using Gameplay.Pool; using Gameplay.Vehicle.Impl; using UnityEngine; namespace Gameplay.Buff { using cfg.BuffCfg; using Framework; using Bullet; using Character; using Skill; using Common; public class BuffManager { private static BuffManager _instance; public static BuffManager instance { get { // if (_instance == null) // { // DebugUtil.LogError("Buff尚未初始化,请先初始化"); // return null; // } return _instance; } } public static BuffManager CreateInstance() { if (_instance != null) { DebugUtil.LogError("请勿重复创建BuffManager"); return _instance; } _instance = new BuffManager(); return _instance; } private readonly Dictionary _unitDict; private readonly List _unitList; private readonly Dictionary _sideBuffManagerDict; private BuffManager() { _unitDict = new Dictionary(); _unitList = new List(); _sideBuffManagerDict = new Dictionary(); } public void Init() { DebugUtil.Log("[Init]------BuffManager"); } public void Dispose() { DebugUtil.Log("[Dispose]------BuffManager"); _instance = null; } public static DataBuff GetBuffConfigById(int id) { return TableManager.Instance.Tables.BuffConfig.Get(id); } public BaseBuff CreateBuffById(GameUnit creator, int id) { var buffConfig = GetBuffConfigById(id); BaseBuff buff = null; switch (buffConfig.BuffType) { case EBuffType.NormalDamage: buff = ObjPoolManager.instance.Get(); break; case EBuffType.MoraleDamage: buff = ObjPoolManager.instance.Get(); break; case EBuffType.AutoRecoverMorale: buff = ObjPoolManager.instance.Get(); break; case EBuffType.AddMorale: buff = ObjPoolManager.instance.Get(); break; case EBuffType.AddShield: buff = ObjPoolManager.instance.Get(); break; case EBuffType.BulletDamage1: buff = ObjPoolManager.instance.Get(); break; case EBuffType.BulletDamage2: buff = ObjPoolManager.instance.Get(); break; case EBuffType.BulletDamage3: buff = ObjPoolManager.instance.Get(); break; case EBuffType.ShowEffect: buff = ObjPoolManager.instance.Get(); break; case EBuffType.ChangeProp: buff = ObjPoolManager.instance.Get(); break; case EBuffType.LoopRecoverMorale: buff = ObjPoolManager.instance.Get(); break; case EBuffType.Chaos: buff = ObjPoolManager.instance.Get(); break; case EBuffType.Stun: buff = ObjPoolManager.instance.Get(); break; case EBuffType.LockPos: buff = ObjPoolManager.instance.Get(); break; case EBuffType.Retreat: buff = ObjPoolManager.instance.Get(); break; case EBuffType.NoRetreat: buff = ObjPoolManager.instance.Get(); break; case EBuffType.FillBullet: buff = ObjPoolManager.instance.Get(); break; case EBuffType.ClearDBuff: buff = ObjPoolManager.instance.Get(); break; case EBuffType.ClearPBuff: buff = ObjPoolManager.instance.Get(); break; case EBuffType.ClearSBuff: buff = ObjPoolManager.instance.Get(); break; case EBuffType.StandTriggerBuff: buff = ObjPoolManager.instance.Get(); break; case EBuffType.LoopRecoverShiled: buff = ObjPoolManager.instance.Get(); break; case EBuffType.AddMoreleFromSkill: buff = ObjPoolManager.instance.Get(); break; default: DebugUtil.LogError("CreateBuffById: UnHandle buffType:{0}", buffConfig.BuffType); break; } if (buff != null) { buff.Ctor(creator, buffConfig); } return buff; } public static void ReturnBuff(T buff) where T : BaseBuff { ObjPoolManager.instance.Return(buff); } public void AddBuff(GameUnit unit, BaseBuff buff) { switch (unit.gameunitType) { case EGameUnitType.Character: case EGameUnitType.Vehicle: var unitManager = _unitDict[unit]; unitManager.AddBuff(buff); break; case EGameUnitType.Summon: // TODO: 召唤物暂时不吃buff break; default: DebugUtil.LogError("暂未实现"); break; } } public void InitVehicle(NormalVehicle vehicle) { if (_unitDict.ContainsKey(vehicle)) { DebugUtil.LogError("FATA ERROR: 不应该出现两个相同的vehicle"); return; } var unitManager = new UnitBuffManager(vehicle); _unitDict.Add(vehicle, unitManager); _unitList.Add(unitManager); // 双向绑定 vehicle.buffManager = unitManager; } public void InitCharacter(Character c) { if (_unitDict.ContainsKey(c)) { DebugUtil.LogError("FATA ERROR: 不应该出现两个相同的character"); return; } var unitManager = new UnitBuffManager(c); _unitDict.Add(c, unitManager); _unitList.Add(unitManager); // 默认全局buff var autoRecoverMoraleBuff = CreateBuffById(c, InnerBuffID.AUTO_RECOVER_MORALE); unitManager.AddBuff(autoRecoverMoraleBuff); // 双向绑定 c.buffManager = unitManager; } public void RemoveCharacter(Character c) { if (!_unitDict.ContainsKey(c)) { DebugUtil.LogError("FATA ERROR: 不应该出现不存在的character"); return; } var unitManager = _unitDict[c]; _unitDict.Remove(c); _unitList.Remove(unitManager); } public void LogicUpdate(float dt) { if (SkillManager.instance.needSkillPaused) { return; } for (var i = 0; i < _unitList.Count; ++i) { var unit = _unitList[i]; unit.LogicUpdate(dt); } } } }