| using System; | 
| using System.Collections.Generic; | 
| using System.Linq; | 
| using UnityEngine; | 
|   | 
| public class BattleEffectMgr : MonoBehaviour | 
| { | 
|     private BattleField battleField; | 
|   | 
|     private Dictionary<int, List<BattleEffectPlayer>> effectDict = new Dictionary<int, List<BattleEffectPlayer>>(); | 
|   | 
|     public void Init(BattleField _battleField) | 
|     { | 
|         Release(); | 
|         battleField = _battleField; | 
|     } | 
|   | 
|     public void Run() | 
|     { | 
|         List<BattleEffectPlayer> runList = new List<BattleEffectPlayer>(); | 
|   | 
|         foreach (KeyValuePair<int, List<BattleEffectPlayer>> kvPair in effectDict) | 
|         { | 
|             runList.AddRange(kvPair.Value); | 
|         } | 
|   | 
|         for (int i = runList.Count - 1; i >= 0; i--) | 
|         { | 
|             BattleEffectPlayer effectPlayer = runList[i]; | 
|             if (effectPlayer != null) | 
|             { | 
|                 effectPlayer.Run(); | 
|             } | 
|         } | 
|     } | 
|   | 
|     public void PauseGame() | 
|     { | 
|         foreach (KeyValuePair<int, List<BattleEffectPlayer>> kvPair in effectDict) | 
|         { | 
|             foreach (BattleEffectPlayer effectPlayer in kvPair.Value) | 
|             { | 
|                 if (effectPlayer != null) | 
|                 { | 
|                     effectPlayer.Pause(); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     public void ResumeGame() | 
|     { | 
|         foreach (KeyValuePair<int, List<BattleEffectPlayer>> kvPair in effectDict) | 
|         { | 
|             foreach (BattleEffectPlayer effectPlayer in kvPair.Value) | 
|             { | 
|                 if (effectPlayer != null) | 
|                 { | 
|                     effectPlayer.Resume(); | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     public BattleEffectPlayer PlayEffect(BattleObject layerDepender, 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<BattleEffectPlayer>(); | 
|         } | 
|   | 
|         bool isRedCamp = camp == BattleCamp.Red; | 
|   | 
|         BattleEffectPlayer effectPlayer = BattleEffectPlayer.Create(effectId, battleField.battleRootNode.transform, isRedCamp); | 
|         // 设置特效缩放和方向 | 
|   | 
|         effectPlayer.transform.position = parent.position; | 
|          | 
|   | 
|         BattleObject temp = layerDepender; | 
|         effectPlayer.onDestroy += (efPlayer) => | 
|         { | 
|             OnEffectDestroy(efPlayer); | 
|             temp.layerMgr.RemoveEffect(efPlayer); | 
|         }; | 
|   | 
|         if (effectPlayer != null) | 
|         { | 
|             effectDict[effectId].Add(effectPlayer); | 
|         } | 
|         effectPlayer.Play(true); | 
|   | 
|         effectPlayer.SetSpeedRatio(battleField.speedRatio); | 
|          | 
|         var effectScale = effectPlayer.transform.localScale; | 
|         effectScale.x *= isRedCamp ? 1 : -1; | 
|         effectPlayer.transform.localScale = effectScale; | 
|   | 
|         if (null != layerDepender) | 
|         { | 
|             layerDepender.layerMgr.AddEffect(effectPlayer); | 
|         } | 
|   | 
|         return effectPlayer; | 
|     } | 
|   | 
|     public void RemoveEffect(int effectId, BattleEffectPlayer effectPlayer) | 
|     { | 
|         List<BattleEffectPlayer> 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<int> fKeys = effectDict.Keys.ToList(); | 
|   | 
|         for (int i = 0; i < fKeys.Count; i++) | 
|         { | 
|             List<BattleEffectPlayer> 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(); | 
|     } | 
|   | 
|     public void SetSpeedRatio(float ratio) | 
|     { | 
|         foreach (var kvPair in effectDict) | 
|         { | 
|             foreach (var effectPlayer in kvPair.Value) | 
|             { | 
|                 effectPlayer.SetSpeedRatio(ratio); | 
|             } | 
|         } | 
|     } | 
| } |