hch
2025-11-20 ed98029a88cd89702980ac7c40b711afddc5aeb2
Main/System/Battle/BattleEffectMgr.cs
@@ -1,23 +1,44 @@
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
public class BattleEffectMgr : MonoBehaviour
{
    private BattleField battleField;
    private Dictionary<int, List<EffectPlayer>> effectDict = new Dictionary<int, List<EffectPlayer>>();
    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<EffectPlayer>> kvPair in effectDict)
        foreach (KeyValuePair<int, List<BattleEffectPlayer>> kvPair in effectDict)
        {
            foreach (EffectPlayer effectPlayer in kvPair.Value)
            foreach (BattleEffectPlayer effectPlayer in kvPair.Value)
            {
                if (effectPlayer != null)
                {
@@ -29,9 +50,9 @@
    public void ResumeGame()
    {
        foreach (KeyValuePair<int, List<EffectPlayer>> kvPair in effectDict)
        foreach (KeyValuePair<int, List<BattleEffectPlayer>> kvPair in effectDict)
        {
            foreach (EffectPlayer effectPlayer in kvPair.Value)
            foreach (BattleEffectPlayer effectPlayer in kvPair.Value)
            {
                if (effectPlayer != null)
                {
@@ -41,25 +62,65 @@
        }
    }
    public EffectPlayer PlayEffect(int ObjID, int effectId, Transform parent)
    public BattleEffectPlayer PlayEffect(BattleObject layerDepender, int effectId, Transform parent, BattleCamp camp)
    {
        if (!effectDict.ContainsKey(effectId))
        if (effectId <= 0)
        {
            effectDict[effectId] = new List<EffectPlayer>();
            Debug.LogError("effect id <= 0");
            return null;
        }
        EffectPlayer effectPlayer = EffectPlayer.Create(effectId, parent);
        effectPlayer.onDestroy += OnEffectDestroy;
        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, EffectPlayer effectPlayer)
    public void RemoveEffect(int effectId, BattleEffectPlayer effectPlayer)
    {
        List<EffectPlayer> effectPlayers = null;
        List<BattleEffectPlayer> effectPlayers = null;
        if (effectDict.TryGetValue(effectId, out effectPlayers))
        {
@@ -73,7 +134,7 @@
        }
    }
    protected void OnEffectDestroy(EffectPlayer effectPlayer)
    protected void OnEffectDestroy(BattleEffectPlayer effectPlayer)
    {
        if (effectDict.ContainsKey(effectPlayer.effectId))
        {
@@ -87,16 +148,41 @@
    public void HaveRest()
    {
        foreach (KeyValuePair<int, List<EffectPlayer>> kvPair in effectDict)
        Release();
    }
    public void Release()
    {
        List<int> fKeys = effectDict.Keys.ToList();
        for (int i = 0; i < fKeys.Count; i++)
        {
            foreach (EffectPlayer effectPlayer in kvPair.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);
            }
        }
    }
}