| using System.Collections; | 
| using System.Collections.Generic; | 
| using UnityEngine; | 
|   | 
| public class EffectPlayer : MonoBehaviour | 
| { | 
|     public int effectId; | 
|   | 
|     public bool autoDestroy = false; | 
|   | 
|     public float destroyDelay = 0f; | 
|   | 
|     [HideInInspector] public Canvas canvas = null; | 
|   | 
|     [HideInInspector] public GameObject effectTarget = null; | 
|   | 
|     protected void Start() | 
|     {  | 
|         ReStart(); | 
|     } | 
|   | 
|     public void Stop() | 
|     {  | 
|         if (null != effectTarget) | 
|         { | 
|             DestroyImmediate(effectTarget); | 
|             effectTarget = null; | 
|         } | 
|     } | 
|   | 
|     public void Play() | 
|     { | 
|         ReStart(); | 
|     } | 
|   | 
|   | 
|   | 
|     protected void ReStart() | 
|     { | 
|         if (EffectMgr.Instance.IsNotShowBySetting(effectId)) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         if (null != effectTarget) | 
|         { | 
|             DestroyImmediate(effectTarget); | 
|             effectTarget = null; | 
|         } | 
|   | 
|         EffectConfig effectCfg = EffectConfig.Get(effectId); | 
|   | 
|         if (null == effectCfg) | 
|         { | 
|             return; | 
|         } | 
|   | 
|         //    YYL TODO | 
|         //    在这里考虑用池的话可能走配置好一点 原本的是无论如何都走池 但是实际上有些特效并不需要 | 
|   | 
|         // 加载特效资源 | 
|         var effectPrefab = ResManager.Instance.LoadAsset<GameObject>("UIEffect/" + effectCfg.packageName, effectCfg.fxName); | 
|         if (effectPrefab == null) | 
|         { | 
|             Debug.LogError($"加载UI特效失败: {effectCfg.packageName}"); | 
|             return; | 
|         } | 
|   | 
|         // 实例化特效 | 
|         effectTarget = Instantiate(effectPrefab, transform); | 
|         effectTarget.name = $"Effect_{effectCfg.fxName}"; | 
|   | 
|         if (null == canvas) | 
|             canvas = GetComponentInParent<Canvas>(); | 
|   | 
|         if (null == canvas) | 
|         { | 
|             Debug.LogError("can not find canvas for UIEffect " + effectId); | 
|             return; | 
|         } | 
|   | 
|         // 添加特效穿透阻挡器 | 
|         EffectPenetrationBlocker blocker = effectTarget.AddComponent<EffectPenetrationBlocker>(); | 
|         blocker.parentCanvas = canvas; | 
|   | 
|         //  延迟一帧才生效 | 
|         this.DelayFrame(blocker.UpdateSortingOrder); | 
|   | 
|         // blocker.UpdateSortingOrder(); | 
|   | 
|         // 自动销毁 | 
|         if (autoDestroy) | 
|         { | 
|             Destroy(effectTarget, destroyDelay); | 
|         } | 
|     } | 
|   | 
| } |