yyl
2026-02-09 5a4e34c8a85737c0fa5b5775122da31155cbaef3
Main/Component/UI/Effect/EffectPlayer.cs
@@ -24,6 +24,7 @@
        {
            if (value != m_EffectID)
            {
                Stop();
                isInit = false;
                m_EffectID = value;
            }
@@ -34,7 +35,7 @@
    public EffectConfig effectConfig;
    public float speedRate = 1f;
    public float speedRate = 1f;    //初始化的时候用 修改使用SetSpeed
    [Header("是否循环播放spine特效")]
    public bool isPlaySpineLoop = false;
@@ -60,7 +61,11 @@
    protected EffectPenetrationBlocker blocker = null;
    protected bool isInit = false;
    protected bool isPlaying = false;
    public bool isPlaying
    {
        get;
        protected set;
    }
    protected List<ParticleSystem> particleList = new List<ParticleSystem>();
@@ -77,8 +82,12 @@
    protected virtual void OnEnable()
    {
        if (isPlayOnEnable)
        if (isPlayOnEnable && playDelayTime != 0)
        {
            PlayAsync(false).Forget();
        }
        else if (isPlayOnEnable)
        {
            Play(false);
        }
@@ -167,7 +176,7 @@
        Clear();
    }
    public virtual void Play(bool showLog = true)
    public virtual void Play(bool showLog = true, bool closePMA = false)
    {
        isPlaying = true;
        if (!isInit)
@@ -186,15 +195,17 @@
            //防范effeid 为0
            if (effectConfig != null && effectConfig.isSpine != 0)
            {
                PlaySpineEffect();
                PlaySpineEffect(closePMA);
            }
            return;
        }
        if (effectConfig == null)
            return;
        if (EffectMgr.IsNotShowBySetting(effectId))
        {
            return;
        }
            {
                return;
            }
        if (null != effectTarget)
        {
@@ -211,14 +222,14 @@
        // 加载spine特效资源
        if (effectConfig.isSpine != 0)
        {
            PlaySpineEffect();
            PlaySpineEffect(closePMA);
        }
        else
        {
            PlayerEffect();
        }
    
        SoundPlayer.Instance.PlayUIAudio(effectConfig.audio);
    }
@@ -238,9 +249,19 @@
    //     return;
    // }
   //越大越快
   public void SetSpeed(float speed)
    {
        speedRate = speed;
        if (spineAnimationState == null)
        {
            Debug.LogError("spineAnimationState is null 可以先调用play");
            return;
        }
      spineAnimationState.TimeScale = speed;
   }
    protected void PlaySpineEffect()
    protected void PlaySpineEffect(bool closePMA = false)
    {
        // 从特效预制体池获取特效
@@ -253,10 +274,10 @@
        {
            //LoadAsset 已经有缓存SkeletonDataAsset
            spineComp.skeletonDataAsset = ResManager.Instance.LoadAsset<SkeletonDataAsset>("UIEffect/" + effectConfig.packageName, effectConfig.fxName);
            //为true时会有部分特效不显示 如满级经验条;改成伽马后部分特效正常,还有部分依然要改此设置
            spineComp.MeshGenerator.settings.pmaVertexColors = !closePMA;
            spineComp.raycastTarget = false;
            spineComp.Initialize(true);
            spineComp.timeScale = speedRate;
            // 检查动画是否有相加模式
            // bool hasAdditiveBlend = CheckForAdditiveBlend(spineComp.Skeleton);
            // if (hasAdditiveBlend)
@@ -270,6 +291,7 @@
            spineComp.material = ResManager.Instance.LoadAsset<Material>("Materials", "SkeletonGraphicDefault-Straight");
            spineAnimationState = spineComp.AnimationState;
            spineAnimationState.TimeScale = speedRate;
            spineAnimationState.Data.DefaultMix = 0f;
            spineAnimationState.Complete -= OnSpineAnimationComplete;
            spineAnimationState.Complete += OnSpineAnimationComplete;
@@ -277,18 +299,23 @@
        spineComp.enabled = true;
        PlayerTheSpineAnim();
        SoundPlayer.Instance.PlayUIAudioDelay(effectConfig.audio).Forget();
    }
        // 播放指定动画
    void PlayerTheSpineAnim()
    {
        spineComp.enabled = true;
        var skeletonData = spineComp.Skeleton.Data;
        if (skeletonData.Animations.Count > 0)
        {
            //按配置或者默认第一个
            int defaultAnimIndex = Math.Max(0, effectConfig.animIndex.Length == 0 ? 0 : effectConfig.animIndex[0]);
            if (playSpineAnimIndex >= skeletonData.Animations.Count)
            {
                playSpineAnimIndex = -1;
                Debug.LogError("特效:" + effectConfig.id + " 索引超出播放默认动画。 error:" + playSpineAnimIndex);
            }
            string defaultAnimationName = skeletonData.Animations.Items[playSpineAnimIndex == -1 ? defaultAnimIndex : playSpineAnimIndex].Name;
            spineAnimationState.SetAnimation(0, defaultAnimationName, isPlaySpineLoop);
        }
@@ -335,7 +362,7 @@
        }
        // 从特效预制体池获取特效
        pool = GameObjectPoolManager.Instance.RequestPool(effectPrefab);
        pool = GameObjectPoolManager.Instance.GetPool(effectPrefab);
        effectTarget = pool.Request();
        // 设置父节点和位置
        effectTarget.transform.SetParent(transform);
@@ -363,14 +390,15 @@
        {
            blocker.SetParentCanvas(canvas);
        }
        SoundPlayer.Instance.PlayUIAudioDelay(effectConfig.audio).Forget();
    }
    public async UniTask PlayAsync(bool showLog = true)
    public async UniTask PlayAsync(bool showLog = true, bool closePMA = false)
    {
        await UniTask.Delay(playDelayTime);
        try
        {
            Play(showLog);
            Play(showLog, closePMA);
        }
        catch (Exception e)
        {
@@ -404,10 +432,11 @@
            spineComp.enabled = false;
            isPlaying = false;
            onComplete?.Invoke();
            if (isReleaseImmediately)
            {
                Release();
            }
            // TODO 会报错暂时注释
            // if (isReleaseImmediately)
            // {
            //     Release();
            // }
        }
    }