| | |
| | | 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) |
| | | { |
| | |
| | | |
| | | 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) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | 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)) |
| | | { |
| | |
| | | } |
| | | } |
| | | |
| | | protected void OnEffectDestroy(EffectPlayer effectPlayer) |
| | | protected void OnEffectDestroy(BattleEffectPlayer effectPlayer) |
| | | { |
| | | if (effectDict.ContainsKey(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); |
| | | } |
| | | } |
| | | } |
| | | } |