From 498c0aa885138063c8537bc6ad4e078857f6f0ee Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期一, 29 十二月 2025 19:09:22 +0800
Subject: [PATCH] 0312 基础界面增加 嵌套ContentSizeFitter需要强制刷新排版

---
 Main/Component/UI/Effect/BattleEffectPlayer.cs |  174 +++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 155 insertions(+), 19 deletions(-)

diff --git a/Main/Component/UI/Effect/BattleEffectPlayer.cs b/Main/Component/UI/Effect/BattleEffectPlayer.cs
index a26950c..5c89ea8 100644
--- a/Main/Component/UI/Effect/BattleEffectPlayer.cs
+++ b/Main/Component/UI/Effect/BattleEffectPlayer.cs
@@ -30,11 +30,55 @@
         }
     }
 
+    private Bone followedBone;
+
+    public bool isBindBone = false;
+
     public bool isRedCamp = true;
     public EffectConfig effectConfig;
 
     public float speedRate = 1.5f;
 
+    private float m_Alpha = 1f;
+
+    public float scaleFactor = 1f;//    闀挎湡涓�1锛屽彧鍦ㄩ渶瑕佽窡妯″瀷涓�璧风缉鏀剧殑鏃跺�欐洿鏀� 鍊间负teamHero.ModelScale
+
+    public float Alpha
+    {
+        get
+        {
+            return m_Alpha;
+        }
+        set
+        {
+            if (value == m_Alpha)
+                return;
+
+            m_Alpha = value;
+            OnAlphaChanged();
+        }
+    }
+
+    private void OnAlphaChanged()
+    {
+        if (spineComp != null)
+        {
+            var skeleton = spineComp.Skeleton;
+            skeleton.A = Alpha;
+            spineComp.LateUpdate();
+        }
+
+        for (int i = 0; i < rendererList.Count; i++)
+        {
+            var renderer = rendererList[i];
+            if (renderer != null && renderer.material != null && renderer.material.HasProperty("_Color"))
+            {
+                Color color = renderer.material.color;
+                color.a = Alpha;
+                renderer.material.color = color;
+            }
+        }
+    }
 
     [Header("鎾斁瀹屾瘯绔嬪嵆鍥炴敹")]
     public bool isReleaseImmediately = false;  //鐣岄潰鐗规晥涓�鑸笉闇�瑕佽嚜鎴戦攢姣侊紝璺熼殢鐣岄潰鎴栬�呯埗瀵硅薄閿�姣佸氨琛�
@@ -59,6 +103,8 @@
     protected Spine.AnimationState spineAnimationState;
 
     public GameObjectPoolManager.GameObjectPool pool;
+
+    public BattleField battleField;
 
     public Action onComplete;
 
@@ -117,6 +163,8 @@
         //  鏈夌壒鏁堝彲鑳藉甫spine鍙堝甫unity鐗规晥鐨勬儏鍐�
         spineComp = gameObject.GetComponentInChildren<SkeletonAnimation>(true);
 
+
+
         if (effectConfig.effectPos != null && effectConfig.effectPos.Length >= 2)
         {
             rectTrans.anchoredPosition += new Vector2((isRedCamp ? 1f : -1f) * effectConfig.effectPos[0], effectConfig.effectPos[1]);
@@ -126,6 +174,7 @@
         {
             rectTrans.localScale *= effectConfig.effectScale;
         }
+
 
         spineComp.loop = effectConfig.isLoop != 0;
     }
@@ -180,10 +229,35 @@
             bool isHeroFront = funcIsHeroFront();
 
             int finalSortingOrder = isHeroFront ?
-                (isEffectFront ? BattleConst.ActiveHeroActionSortingOrder : BattleConst.ActiveHeroBackSortingOrder) : (isEffectFront ? BattleConst.UnactiveHeroFrontSortingOrder : BattleConst.UnactiveHeroBackSortingOrder);
+                (isEffectFront ? BattleConst.ActiveHeroActionSortingOrder + 1 : BattleConst.ActiveHeroBackSortingOrder) : (isEffectFront ? BattleConst.UnactiveHeroFrontSortingOrder : BattleConst.UnactiveHeroBackSortingOrder);
 
 
             blocker.SetSortingOrder(finalSortingOrder);
+        }
+    }
+
+    public void FollowBoneXY()
+    {
+        if (followedBone == null || !isBindBone)
+        {
+            return;
+        }
+
+        Vector2 vector2 = Vector2.zero;
+
+        if (effectConfig.effectPos != null && effectConfig.effectPos.Length >= 2)
+        {
+            vector2 = new Vector2((isRedCamp ? 1f : -1f) * effectConfig.effectPos[0], effectConfig.effectPos[1]);
+        }
+
+        if (spineComp != null)
+        {
+            spineComp.transform.localPosition = new Vector3(followedBone.WorldX + vector2.x, followedBone.WorldY + vector2.y, 0);
+        }
+
+        if (effectTarget != null)
+        {
+            effectTarget.transform.localPosition = new Vector3(followedBone.WorldX + vector2.x, followedBone.WorldY + vector2.y, 0);
         }
     }
 
@@ -276,22 +350,45 @@
         {
             PlayUnityEffect();
         }
+
+        battleField?.soundManager.PlayEffectSound(effectConfig.audio);
+
+        OnAlphaChanged();
     }
 
     protected void PlaySpineEffect()
     {
-        //  杩欓噷鏄函spine鐨勯�昏緫
-
         if (spineComp == null)
         {
             Debug.LogError("BattleEffectPlayer spineComp is null, effect id is " + effectId);
             return;
         }
 
-        SkeletonDataAsset skeletonDataAsset = ResManager.Instance.LoadAsset<SkeletonDataAsset>("UIEffect/" + effectConfig.packageName, effectConfig.fxName);
+        // ===== 绠�鍖栵細鐩存帴浠庣紦瀛樿幏鍙栵紝缂撳瓨鍐呴儴浼氳嚜鍔ㄥ姞杞� =====
+        string directory = "UIEffect/" + effectConfig.packageName;
+        SkeletonDataAsset skeletonDataAsset = BattleResManager.Instance.GetSpineResource(
+            directory, 
+            effectConfig.fxName,
+            battleField?.guid
+        );
+        
+        if (skeletonDataAsset == null)
+        {
+            Debug.LogError($"BattleEffectPlayer: Failed to load effect spine {effectConfig.fxName}");
+            return;
+        }
+        // ================================
+
         spineComp.skeletonDataAsset = skeletonDataAsset;
         spineComp.Initialize(true);
         spineComp.timeScale = speedRate;
+
+        if (scaleX != 0f && spineComp != null && spineComp.skeleton != null)
+        {
+            spineComp.skeleton.ScaleX = scaleX;
+        }
+
+        spineComp.skeleton.A = Alpha;
 
         spineAnimationState = spineComp.state;
         spineAnimationState.Complete -= OnSpineAnimationComplete;
@@ -307,12 +404,14 @@
         spineComp.enabled = true;
 
         spineComp.timeScale = speedRate;
-        spineAnimationState.TimeScale = speedRate;
+
+        spineComp.LateUpdate();
+
 
         Spine.Animation animation = spineAnimationState.Data.SkeletonData.Animations.First();
         spineAnimationState.SetAnimation(0, animation, effectConfig.isLoop != 0);
 
-        SoundPlayer.Instance.PlayUIAudio(effectConfig.audio);
+        // SoundPlayer.Instance.PlayUIAudio(effectConfig.audio);
 
     }
 
@@ -346,7 +445,7 @@
         }
 
         // 浠庣壒鏁堥鍒朵綋姹犺幏鍙栫壒鏁�
-        pool = GameObjectPoolManager.Instance.RequestPool(effectPrefab);
+        pool = GameObjectPoolManager.Instance.GetPool(effectPrefab);
         effectTarget = pool.Request();
         // 璁剧疆鐖惰妭鐐瑰拰浣嶇疆
         effectTarget.transform.SetParent(transform);
@@ -368,7 +467,7 @@
 
         blocker.onSortingChanged = OnSortingChanged;
 
-        SoundPlayer.Instance.PlayUIAudio(effectConfig.audio);
+        // SoundPlayer.Instance.PlayUIAudio(effectConfig.audio);
 
     }
 
@@ -449,7 +548,7 @@
 
 
     //  鍒涘缓鍚庣殑鐗规晥浼氳嚜鍔ㄩ殣钘� 闇�瑕佹墜鍔ㄨ皟鐢≒lay鎵嶈兘鎾斁
-    public static BattleEffectPlayer Create(int effectId, Transform parent, bool isRedCamp)
+    public static BattleEffectPlayer Create(int effectId, BattleField _battleField, Transform parent, bool isRedCamp, float _scaleRatio)
     {
         // 鐩存帴鍒涘缓鐗规晥鎾斁鍣紝涓嶄娇鐢ㄥ璞℃睜
         BattleEffectPlayer battleEffectPlayer = null;
@@ -457,9 +556,12 @@
         GameObject newGo = new GameObject("BattleEffectPlayer_" + effectId);
         newGo.transform.SetParent(parent, false);
         battleEffectPlayer = newGo.AddComponent<BattleEffectPlayer>();
+        battleEffectPlayer.battleField = _battleField;
         battleEffectPlayer.rectTrans = newGo.AddMissingComponent<RectTransform>();
         
         battleEffectPlayer.effectId = effectId;
+
+        battleEffectPlayer.scaleFactor = _scaleRatio;
 
         // 璁剧疆闃佃惀
         battleEffectPlayer.isRedCamp = isRedCamp;
@@ -491,11 +593,6 @@
             spineComp.timeScale = 0f;
         }
 
-        if (spineAnimationState != null)
-        {
-            spineAnimationState.TimeScale = 0f;
-        }
-
         // Animator鍔ㄧ敾
         foreach (var animator in animatorList)
         {
@@ -516,11 +613,6 @@
         if (spineComp != null)
         {
             spineComp.timeScale = speedRate;
-        }
-
-        if (spineAnimationState != null)
-        {
-            spineAnimationState.TimeScale = speedRate;
         }
 
         // Animator鍔ㄧ敾
@@ -584,4 +676,48 @@
             animator.speed = speedRate;
         }
     }
+
+    public void BindBone(SkeletonAnimation skeletonAnim, string v)
+    {
+        Bone bone = skeletonAnim.skeleton.FindBone(v);
+        isBindBone = false;
+        followedBone = null;
+        if (null == bone)
+        {
+             return;
+        }
+
+        rectTrans.localScale *= scaleFactor;
+
+        isBindBone = true;
+        followedBone = bone;
+
+        BoneFollower boneFollower = gameObject.AddMissingComponent<BoneFollower>();
+        boneFollower.boneName = v;
+        boneFollower.skeletonRenderer = skeletonAnim;
+        
+        boneFollower.followBoneRotation = false;
+        boneFollower.followXYPosition = true;
+        boneFollower.followZPosition = false;
+        boneFollower.followLocalScale = false;
+        boneFollower.followParentWorldScale = false;
+        boneFollower.followSkeletonFlip = false;
+
+        boneFollower.Initialize();
+        boneFollower.LateUpdate();
+    }
+
+    private float scaleX = 0f;
+
+    public void SetScaleX(float v)
+    {
+        if (spineComp != null && spineComp.skeleton != null)
+        {
+            spineComp.skeleton.ScaleX = v;
+        }
+        else
+        {
+            scaleX = v;
+        }
+    }
 }

--
Gitblit v1.8.0