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.SetSpeedRatio(battleField.speedRatio); 
 | 
  
 | 
        effectPlayer.Play(true); 
 | 
  
 | 
         
 | 
        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); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |