hch
2025-11-20 ed98029a88cd89702980ac7c40b711afddc5aeb2
Main/System/Battle/BattleEffectMgr.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class BattleEffectMgr : MonoBehaviour
@@ -10,7 +11,27 @@
    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()
@@ -41,19 +62,59 @@
        }
    }
    public BattleEffectPlayer PlayEffect(int ObjID, int effectId, Transform parent)
    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>();
        }
        BattleEffectPlayer effectPlayer = BattleEffectPlayer.Create(effectId, parent);
        effectPlayer.onDestroy += OnEffectDestroy;
        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;
    }
@@ -87,32 +148,41 @@
    public void HaveRest()
    {
        foreach (KeyValuePair<int, List<BattleEffectPlayer>> kvPair in effectDict)
        {
            foreach (BattleEffectPlayer effectPlayer in kvPair.Value)
            {
                if (effectPlayer != null)
                {
                    GameObject.DestroyImmediate(effectPlayer.gameObject);
                }
            }
        }
        effectDict.Clear();
        Release();
    }
    public void Release()
    {
        foreach (var effect in effectDict)
        List<int> fKeys = effectDict.Keys.ToList();
        for (int i = 0; i < fKeys.Count; i++)
        {
            foreach (var effectPlayer in effect.Value)
            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);
            }
        }
    }
}