using System; using System.Collections.Generic; using System.Linq; using Spine.Unity; using UnityEngine; public class BattleObjectBuffMgr { private Dictionary>> buffEffectDict = new Dictionary>>(); private Dictionary buffDataDict = new Dictionary(); private BattleObject battleObject; public void Init(BattleObject _battleObject) { battleObject = _battleObject; } public void Release() { } public void Run() { List removeEffectList = new List(); // 跟随BattleObject foreach (var kv in buffEffectDict) { BattleEffectPlayer effectPlayer = kv.Value.Key; if (null != effectPlayer) { if (effectPlayer.isBindBone) { continue; } effectPlayer.transform.position = battleObject.heroRectTrans.position; var effectPos = effectPlayer.effectConfig.effectPos; if (null != effectPos && effectPos.Length >= 2) { effectPlayer.rectTrans.anchoredPosition += new Vector2(effectPos[0], effectPos[1]); } } else { removeEffectList.Add(kv.Key); } } foreach (var effectId in removeEffectList) { buffEffectDict.Remove(effectId); } } public void RemoveAllBuff() { foreach (var kv in buffEffectDict) { KeyValuePair> pair = kv.Value; battleObject.battleField.battleEffectMgr.RemoveEffect(kv.Key, pair.Key); } buffEffectDict.Clear(); buffDataDict.Clear(); battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); } // 删除buff public void RemoveBuff(HB429_tagSCBuffDel vNetData) { HB428_tagSCBuffRefresh buffData = null; if (buffDataDict.TryGetValue(vNetData.BuffID, out buffData)) { buffDataDict.Remove(vNetData.BuffID); } if (buffData != null) { SkillConfig skillConfig = SkillConfig.Get((int)buffData.SkillID); if (null == skillConfig || skillConfig.BuffEffect <= 0) { return; } KeyValuePair> effectPair; if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out effectPair)) { effectPair.Value.Remove(vNetData.BuffID); if (effectPair.Value.Count == 0) { // 没有这个buff了 battleObject.battleField.battleEffectMgr.RemoveEffect(skillConfig.BuffEffect, effectPair.Key); buffEffectDict.Remove(skillConfig.BuffEffect); } } } // 不做表现 battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); } // 刷新buff public void RefreshBuff(HB428_tagSCBuffRefresh vNetData, bool insert = false) { SkillConfig skillConfig = SkillConfig.Get((int)vNetData.SkillID); if (null == skillConfig) { Debug.LogError("buff对应的技能不存在,skillId : " + vNetData.SkillID); return; } // bool isNew = false; if (buffDataDict.ContainsKey(vNetData.BuffID)) { buffDataDict[vNetData.BuffID] = vNetData; } else { // isNew = true; buffDataDict.Add(vNetData.BuffID, vNetData); } if (vNetData.IsAdd != 0) { BuffMountAction buffMountAction = new BuffMountAction(battleObject.battleField, new List(){ vNetData}, () => { if (null != skillConfig && skillConfig.BuffEffect > 0) { // 已经存在相同的buff特效 if (buffEffectDict.TryGetValue(skillConfig.BuffEffect, out KeyValuePair> pair)) { pair.Value.Add(vNetData.BuffID); } else { BattleEffectPlayer effect = battleObject.battleField.battleEffectMgr.PlayEffect(battleObject, skillConfig.BuffEffect, battleObject.heroRectTrans, battleObject.Camp); BoneFollower boneFollower = effect.AddMissingComponent(); effect.BindBone(battleObject.motionBase.skeletonAnim, "hit"); HashSet buffIdSet = new HashSet(); buffIdSet.Add(vNetData.BuffID); buffEffectDict.Add(skillConfig.BuffEffect, new KeyValuePair>(effect, buffIdSet)); } } battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); }); if (insert) { battleObject.battleField.recordPlayer.ImmediatelyPlay(buffMountAction); } else { battleObject.battleField.recordPlayer.PlayRecord(buffMountAction); } } else { // 已经存在的buff 刷新 battleObject.heroInfoBar.RefreshBuff(buffDataDict.Values.ToList()); } } public void InsertBuff(HB428_tagSCBuffRefresh vNetData) { RefreshBuff(vNetData, true); } }