From 84fba9533cc9a0f1a3400bbc3f9a36cca94a1fbc Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 26 十二月 2025 18:30:16 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.1.20:10010/r/Project_SG_scripts
---
Main/Component/UI/Effect/BattleEffectPlayer.cs | 350 +++++++++++++++++++++++++++++++++++++++++++++-------------
1 files changed, 272 insertions(+), 78 deletions(-)
diff --git a/Main/Component/UI/Effect/BattleEffectPlayer.cs b/Main/Component/UI/Effect/BattleEffectPlayer.cs
index 362ac40..5c89ea8 100644
--- a/Main/Component/UI/Effect/BattleEffectPlayer.cs
+++ b/Main/Component/UI/Effect/BattleEffectPlayer.cs
@@ -30,25 +30,64 @@
}
}
+ private Bone followedBone;
+ public bool isBindBone = false;
+ public bool isRedCamp = true;
public EffectConfig effectConfig;
- public float speedRate = 1f;
+ 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; //鐣岄潰鐗规晥涓�鑸笉闇�瑕佽嚜鎴戦攢姣侊紝璺熼殢鐣岄潰鎴栬�呯埗瀵硅薄閿�姣佸氨琛�
public Action<BattleEffectPlayer> onDestroy;
- [HideInInspector] public Canvas canvas = null;
-
[HideInInspector] public GameObject effectTarget = null;
- protected EffectPenetrationBlocker blocker = null;
+ protected RendererAdjuster blocker = null;
protected bool isInit = false;
@@ -65,15 +104,23 @@
public GameObjectPoolManager.GameObjectPool pool;
+ public BattleField battleField;
+
public Action onComplete;
+
+ private bool isPlaying = false;
+
+ private float timer = 0f;
protected virtual void OnEnable()
{
- if (spineComp != null)
- {
- //闅愯棌锛屼細鏈夐潤鎬佹樉绀洪棶棰�
- spineComp.enabled = false;
- }
+ // if (spineComp != null)
+ // {
+ // //闅愯棌锛屼細鏈夐潤鎬佹樉绀洪棶棰�
+ // spineComp.enabled = false;
+ // }
+
+ ApplySortingOrder();
}
@@ -115,6 +162,21 @@
}
// 鏈夌壒鏁堝彲鑳藉甫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]);
+ }
+
+ if (effectConfig.effectScale > 0f)
+ {
+ rectTrans.localScale *= effectConfig.effectScale;
+ }
+
+
+ spineComp.loop = effectConfig.isLoop != 0;
}
protected virtual void Clear()
@@ -148,24 +210,73 @@
onComplete?.Invoke();
}
+ public Func<bool> funcIsHeroFront;
+
+ public void SetSortingOrder(Func<bool> _isHeroFrontCallback)
+ {
+ funcIsHeroFront = _isHeroFrontCallback;
+
+ ApplySortingOrder();
+ }
+
+
+ public void ApplySortingOrder()
+ {
+ if (null != blocker && effectConfig != null && funcIsHeroFront != null)
+ {
+ bool isEffectFront = effectConfig.frontBack == 1;
+
+ bool isHeroFront = funcIsHeroFront();
+
+ int finalSortingOrder = isHeroFront ?
+ (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);
+ }
+ }
+
public virtual void Play(bool showLog = true)
{
-
-
if (!isInit)
+ {
+ InitComponent(showLog);
+ isInit = true;
+ }
+ else
+ {
+ //閬垮厤閲嶅鍒涘缓
+ if (!this.gameObject.activeSelf)
{
- InitComponent(showLog);
- isInit = true;
+ this.gameObject.SetActive(true);
}
- else
- {
- //閬垮厤閲嶅鍒涘缓
- if (!this.gameObject.activeSelf)
- {
- this.gameObject.SetActive(true);
- }
- return;
- }
+ return;
+ }
if (EffectMgr.IsNotShowBySetting(effectId))
{
@@ -184,9 +295,34 @@
this.gameObject.SetActive(true);
}
- PlayEffect();
-
+ isPlaying = true;
+ timer = 0f;
+ PlayEffect();
+ }
+
+
+
+ public void Run()
+ {
+ if (null == effectConfig)
+ {
+ return;
+ }
+
+ if (!isPlaying)
+ {
+ return;
+ }
+
+ if (effectConfig.autoDestroy != 0)
+ {
+ timer += Time.deltaTime * speedRate;
+ if (timer >= effectConfig.destroyDelay)
+ {
+ GameObject.DestroyImmediate(gameObject);
+ }
+ }
}
protected virtual void PlayEffect()
@@ -198,7 +334,7 @@
}
// 濡傛灉delay灏忎簬绛変簬0 閭d細绔嬪埢鎵ц
- this.DelayTime(effectConfig.delayPlay, () =>
+ this.DelayTime(effectConfig.delayPlay / speedRate, () =>
{
PlayEffectInternal();
});
@@ -214,48 +350,68 @@
{
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;
spineAnimationState.Complete += OnSpineAnimationComplete;
-
- if (null == canvas)
- canvas = GetComponentInParent<Canvas>();
-
// 娣诲姞鐗规晥绌块�忛樆鎸″櫒
- blocker = spineComp.AddMissingComponent<EffectPenetrationBlocker>();
+ blocker = spineComp.AddMissingComponent<RendererAdjuster>();
blocker.onSortingChanged = OnSortingChanged;
- // 濡傛灉娌℃湁canvas鐨勮瘽 姝e父鏄洜涓轰笉鍦˙attleWin涓嬮潰鐨勮妭鐐� 鎰忔�濆氨鏄綋鍓嶆病鏈夋樉绀� 绛夊埌鍒囧洖鎴樻枟鐨勬椂鍊欏啀閫氳繃BattleField.UpdateCanvas鏉ユ洿鏂�
- if (canvas != null)
- {
- blocker.SetParentCanvas(canvas);
- }
+ ApplySortingOrder();
spineComp.enabled = true;
+
+ spineComp.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);
}
@@ -289,7 +445,7 @@
}
// 浠庣壒鏁堥鍒朵綋姹犺幏鍙栫壒鏁�
- pool = GameObjectPoolManager.Instance.RequestPool(effectPrefab);
+ pool = GameObjectPoolManager.Instance.GetPool(effectPrefab);
effectTarget = pool.Request();
// 璁剧疆鐖惰妭鐐瑰拰浣嶇疆
effectTarget.transform.SetParent(transform);
@@ -305,21 +461,13 @@
OnUnityAnimationComplete();
- if (null == canvas)
- canvas = GetComponentInParent<Canvas>();
// 娣诲姞鐗规晥绌块�忛樆鎸″櫒
- blocker = effectTarget.AddMissingComponent<EffectPenetrationBlocker>();
+ blocker = effectTarget.AddMissingComponent<RendererAdjuster>();
blocker.onSortingChanged = OnSortingChanged;
- // 濡傛灉娌℃湁canvas鐨勮瘽 姝e父鏄洜涓轰笉鍦˙attleWin涓嬮潰鐨勮妭鐐� 鎰忔�濆氨鏄綋鍓嶆病鏈夋樉绀� 绛夊埌鍒囧洖鎴樻枟鐨勬椂鍊欏啀閫氳繃BattleField.UpdateCanvas鏉ユ洿鏂�
- if (canvas != null)
- {
- blocker.SetParentCanvas(canvas);
- }
-
- SoundPlayer.Instance.PlayUIAudio(effectConfig.audio);
+ // SoundPlayer.Instance.PlayUIAudio(effectConfig.audio);
}
@@ -335,9 +483,13 @@
public string sortingLayer;
public int sortingOrder;
+ public RectTransform rectTrans;
protected void OnSortingChanged(string _sortingLayer, int _sortingOrder)
{
+ if (null == spineComp)
+ return;
+
sortingLayer = _sortingLayer;
sortingOrder = _sortingOrder;
// 澶勭悊鎺掑簭鍙樺寲
@@ -396,25 +548,26 @@
// 鍒涘缓鍚庣殑鐗规晥浼氳嚜鍔ㄩ殣钘� 闇�瑕佹墜鍔ㄨ皟鐢≒lay鎵嶈兘鎾斁
- public static BattleEffectPlayer Create(int effectId, Transform parent, bool createNewChild = false)
+ public static BattleEffectPlayer Create(int effectId, BattleField _battleField, Transform parent, bool isRedCamp, float _scaleRatio)
{
// 鐩存帴鍒涘缓鐗规晥鎾斁鍣紝涓嶄娇鐢ㄥ璞℃睜
- BattleEffectPlayer BattleEffectPlayer = null;
+ BattleEffectPlayer battleEffectPlayer = null;
- if (createNewChild)
- {
- GameObject newGo = new GameObject("BattleEffectPlayer_" + effectId);
- newGo.transform.SetParent(parent, false);
- BattleEffectPlayer = newGo.AddComponent<BattleEffectPlayer>();
- }
- else
- {
- BattleEffectPlayer = parent.AddMissingComponent<BattleEffectPlayer>();
- }
+ 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.effectId = effectId;
- BattleEffectPlayer.SetActive(true);
- return BattleEffectPlayer;
+ battleEffectPlayer.scaleFactor = _scaleRatio;
+
+ // 璁剧疆闃佃惀
+ battleEffectPlayer.isRedCamp = isRedCamp;
+
+ battleEffectPlayer.SetActive(true);
+ return battleEffectPlayer;
}
/// <summary>
@@ -430,7 +583,7 @@
public void Pause()
{
- if (effectTarget == null) return;
+ // if (effectTarget == null) return;
// Spine鍔ㄧ敾
// var spineGraphics = effectTarget.GetComponentsInChildren<SkeletonGraphic>(true);
@@ -455,7 +608,7 @@
public void Resume()
{
- if (effectTarget == null) return;
+ // if (effectTarget == null) return;
if (spineComp != null)
{
@@ -509,21 +662,62 @@
return true;
}
- /// <summary>
- /// 璁剧疆閬僵锛堟敮鎸丷ectMask2D銆丮ask銆丼moothMask绛夛級
- /// </summary>
- public void SetMask(RectTransform maskArea = null)
+ public void SetSpeedRatio(float ratio)
{
- if (effectTarget == null || blocker == null)
- return;
-
- // 浼樺厛浣跨敤浼犲叆鐨刴askArea
- if (maskArea != null)
+ speedRate = ratio;
+ if (spineComp != null)
{
- blocker.PerformMask(maskArea);
- return;
+ spineComp.timeScale = speedRate;
+ }
+
+ // Animator鍔ㄧ敾
+ foreach (var animator in animatorList)
+ {
+ 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