using System; using System.Collections.Generic; using System.Linq; using UnityEngine; public class BattleEffectMgr : MonoBehaviour { private BattleField battleField; private Dictionary> effectDict = new Dictionary>(); public void Init(BattleField _battleField) { Release(); battleField = _battleField; } public void PauseGame() { foreach (KeyValuePair> kvPair in effectDict) { foreach (BattleEffectPlayer effectPlayer in kvPair.Value) { if (effectPlayer != null) { effectPlayer.Pause(); } } } } public void ResumeGame() { foreach (KeyValuePair> kvPair in effectDict) { foreach (BattleEffectPlayer effectPlayer in kvPair.Value) { if (effectPlayer != null) { effectPlayer.Resume(); } } } } public BattleEffectPlayer PlayEffect(int ObjID, int effectId, Transform parent, BattleCamp camp) { if (effectId <= 0) { Debug.LogError("effect id <= 0"); return null; } var effectCfg = EffectConfig.Get(effectId); if (null == effectCfg) { Debug.LogError("effect config is null, effectId : " + effectId); return null; } if (!effectDict.ContainsKey(effectId)) { effectDict[effectId] = new List(); } bool isRedCamp = camp == BattleCamp.Red; BattleEffectPlayer effectPlayer = BattleEffectPlayer.Create(effectId, battleField.battleRootNode.transform, isRedCamp); // 设置特效缩放和方向 effectPlayer.transform.position = parent.position; effectPlayer.onDestroy += OnEffectDestroy; if (effectPlayer != null) { effectDict[effectId].Add(effectPlayer); } effectPlayer.Play(true); var effectScale = effectPlayer.transform.localScale; effectScale.x *= isRedCamp ? 1 : -1; effectPlayer.transform.localScale = effectScale; return effectPlayer; } public void RemoveEffect(int effectId, BattleEffectPlayer effectPlayer) { List effectPlayers = null; if (effectDict.TryGetValue(effectId, out effectPlayers)) { effectPlayers.Remove(effectPlayer); GameObject.DestroyImmediate(effectPlayer.gameObject); effectPlayer = null; } else { Debug.LogError("could not find effect in list, effectid : " + effectId); } } protected void OnEffectDestroy(BattleEffectPlayer effectPlayer) { if (effectDict.ContainsKey(effectPlayer.effectId)) { effectDict[effectPlayer.effectId].Remove(effectPlayer); if (effectDict[effectPlayer.effectId].Count == 0) { effectDict.Remove(effectPlayer.effectId); } } } public void HaveRest() { Release(); } public void Release() { List fKeys = effectDict.Keys.ToList(); for (int i = 0; i < fKeys.Count; i++) { List effectPlayers = effectDict[fKeys[i]]; while (effectPlayers.Count > 0) { var effectPlayer = effectPlayers[0]; if (effectPlayer != null) { GameObject.DestroyImmediate(effectPlayer.gameObject); } else { effectPlayers.RemoveAt(0); } } } effectDict.Clear(); } }