From ed98029a88cd89702980ac7c40b711afddc5aeb2 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 20 十一月 2025 14:44:59 +0800
Subject: [PATCH] Merge branch 'master' of http://mobile.secondworld.net.cn:10010/r/Project_SG_scripts
---
Main/System/Battle/Motion/MotionBase.cs | 130 +++++++++++++++++++++++++++++++++++++++++-
1 files changed, 125 insertions(+), 5 deletions(-)
diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index 5be8665..9539668 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -23,7 +23,12 @@
protected Spine.Skeleton skeleton;
protected float defaultMixDuration = 0f;
private Spine.TrackEntry currentTrack;
- private Dictionary<int, Spine.TrackEntry> activeSkillTracks = new Dictionary<int, Spine.TrackEntry>(); // 鏀逛负瀛楀吀锛歵rackIndex -> TrackEntry
+ private Dictionary<int, Spine.TrackEntry> activeSkillTracks = new Dictionary<int, Spine.TrackEntry>();
+
+ // 瀛愭妧鑳借建閬撴睜绠$悊锛堝湪Init涓垵濮嬪寲锛屼笉瑕佸湪杩欓噷鍒濆鍖栵級
+ private Queue<int> availableSubTracks;
+ private Dictionary<SkillBase, int> subSkillTrackMap = new Dictionary<SkillBase, int>();
+
private SkeletonIllusionShadow illusionShadow;
private bool playingSkillAnim = false;
@@ -52,6 +57,11 @@
if (animState != null)
animState.Data.DefaultMix = defaultMixDuration;
+ // 鍒濆鍖栧瓙鎶�鑳借建閬撴睜
+ availableSubTracks = new Queue<int>();
+ for (int i = 1; i <= 8; i++)
+ availableSubTracks.Enqueue(i);
+
PlayAnimation(MotionName.idle, true);
SetupAnimationHandlers();
@@ -63,6 +73,8 @@
{
trackEntryCallbacks.Clear();
activeSkillTracks.Clear();
+ availableSubTracks?.Clear();
+ subSkillTrackMap.Clear();
if (animState != null)
{
animState.Complete -= OnAnimationComplete;
@@ -93,6 +105,41 @@
return currentTrack;
}
+ public virtual Spine.TrackEntry PlayDeadAnimation(Action onComplete = null)
+ {
+ if (animState == null) return null;
+
+ // 浣跨敤杞ㄩ亾9浣滀负姝讳骸鍔ㄧ敾涓撶敤杞ㄩ亾锛堢嫭绔嬩簬涓昏建閬�0鍜屽瓙鎶�鑳借建閬�1-8锛�
+ const int deathTrackIndex = 9;
+
+ // 娓呴櫎姝讳骸杞ㄩ亾涓婄殑鍥炶皟
+ if (activeSkillTracks.TryGetValue(deathTrackIndex, out var oldDeathTrack))
+ {
+ if (trackEntryCallbacks.ContainsKey(oldDeathTrack))
+ trackEntryCallbacks.Remove(oldDeathTrack);
+ }
+
+ Spine.Animation deadAnim = FindAnim(MotionName.dead.ToString());
+ if (deadAnim == null)
+ {
+ Debug.LogError("鎵句笉鍒版浜″姩鐢�");
+ onComplete?.Invoke();
+ return null;
+ }
+
+ Spine.TrackEntry deathTrack = animState.SetAnimation(deathTrackIndex, deadAnim, false);
+
+ if (deathTrack != null)
+ {
+ activeSkillTracks[deathTrackIndex] = deathTrack;
+
+ if (onComplete != null)
+ trackEntryCallbacks[deathTrack] = onComplete;
+ }
+
+ return deathTrack;
+ }
+
private void AddAction(Action action) => runningActions.Add(action);
private void RemoveAction(Action action) => runningActions.Remove(action);
@@ -109,8 +156,8 @@
return null;
}
- // 瀛愭妧鑳藉己鍒朵娇鐢ㄦ棤鍔ㄧ敾妯″紡锛屾垨鑰呭鏋滄病鏈夊姩鐢诲悕绉�
- if (isSubSkill || string.IsNullOrEmpty(skillConfig.SkillMotionName))
+ // 濡傛灉娌℃湁鍔ㄧ敾鍚嶇О锛屼娇鐢ㄦ棤鍔ㄧ敾妯″紡
+ if (string.IsNullOrEmpty(skillConfig.SkillMotionName))
{
PlaySkillNoAnim(skillConfig, skillBase, onComplete, isSubSkill);
return null;
@@ -136,13 +183,41 @@
int frameCount = activeFrames.Length;
float recoveryFrame = skillConfig.RecoveryFrames;
- // 涓绘妧鑳界敤 track 0锛屽瓙鎶�鑳界敤 track 1
- int trackIndex = isSubSkill ? 1 : 0;
+ // 杞ㄩ亾鍒嗛厤绛栫暐锛氫富鎶�鑳界敤 track 0锛屽瓙鎶�鑳戒粠杞ㄩ亾姹犲垎閰�
+ int trackIndex = 0;
+ if (isSubSkill)
+ {
+ if (availableSubTracks != null && availableSubTracks.Count > 0)
+ {
+ trackIndex = availableSubTracks.Dequeue();
+ subSkillTrackMap[skillBase] = trackIndex;
+ }
+ else
+ {
+ // 杞ㄩ亾姹犺�楀敖鎴栨湭鍒濆鍖栵紝鍥為��鍒版棤鍔ㄧ敾妯″紡
+ Debug.LogWarning($"瀛愭妧鑳借建閬撴睜宸叉弧鎴栨湭鍒濆鍖栵紝鎶�鑳絳skillConfig.SkillID}浣跨敤鏃犲姩鐢绘ā寮�");
+ PlaySkillNoAnim(skillConfig, skillBase, onComplete, isSubSkill);
+ return null;
+ }
+ }
+
Spine.TrackEntry skillTrack = null;
if (hasAnim)
{
skillTrack = animState.SetAnimation(trackIndex, targetAnim, false);
+ if (null == skillTrack)
+ {
+ Debug.LogError($"鎶�鑳� {skillConfig.SkillID} 鍔ㄧ敾璁剧疆澶辫触");
+ // 濡傛灉鏄瓙鎶�鑳戒笖鍒嗛厤浜嗚建閬擄紝闇�瑕佸洖鏀�
+ if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+ {
+ if (availableSubTracks != null)
+ availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+ subSkillTrackMap.Remove(skillBase);
+ }
+ return null;
+ }
// 鍙湁涓绘妧鑳芥墠鏇存柊 currentTrack
if (!isSubSkill)
@@ -175,6 +250,14 @@
{
if (activeSkillTracks[trackIndex] == skillTrack)
activeSkillTracks.Remove(trackIndex);
+ }
+
+ // 鍥炴敹瀛愭妧鑳借建閬�
+ if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+ {
+ if (availableSubTracks != null)
+ availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+ subSkillTrackMap.Remove(skillBase);
}
// 鍙湁褰撴病鏈夊叾浠栨椿璺冩妧鑳芥椂鎵嶅浣� playingSkillAnim
@@ -214,6 +297,15 @@
// 娓呯悊骞剁‘淇濈姸鎬佸浣�
RemoveAction(frameHandler);
+
+ // 鍥炴敹瀛愭妧鑳借建閬�
+ if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+ {
+ if (availableSubTracks != null)
+ availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+ subSkillTrackMap.Remove(skillBase);
+ }
+
if (activeSkillTracks.Count == 0)
playingSkillAnim = false;
return;
@@ -227,6 +319,15 @@
RemoveAction(frameHandler);
if (activeSkillTracks.ContainsKey(trackIndex))
activeSkillTracks.Remove(trackIndex);
+
+ // 鍥炴敹瀛愭妧鑳借建閬�
+ if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+ {
+ if (availableSubTracks != null)
+ availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+ subSkillTrackMap.Remove(skillBase);
+ }
+
if (activeSkillTracks.Count == 0)
playingSkillAnim = false;
return;
@@ -303,6 +404,14 @@
{
if (activeSkillTracks[trackIndex] == skillTrack)
activeSkillTracks.Remove(trackIndex);
+ }
+
+ // 鍥炴敹瀛愭妧鑳借建閬�
+ if (isSubSkill && subSkillTrackMap.ContainsKey(skillBase))
+ {
+ if (availableSubTracks != null)
+ availableSubTracks.Enqueue(subSkillTrackMap[skillBase]);
+ subSkillTrackMap.Remove(skillBase);
}
// 鍙湁褰撴病鏈夊叾浠栨椿璺冩妧鑳芥椂鎵嶅浣� playingSkillAnim
@@ -436,6 +545,17 @@
trackEntryCallbacks.Clear();
runningActions.Clear();
activeSkillTracks.Clear();
+
+ // 閲嶇疆瀛愭妧鑳借建閬撴睜
+ if (availableSubTracks == null)
+ availableSubTracks = new Queue<int>();
+ else
+ availableSubTracks.Clear();
+
+ subSkillTrackMap.Clear();
+ for (int i = 1; i <= 8; i++)
+ availableSubTracks.Enqueue(i);
+
playingSkillAnim = false;
PlayAnimation(MotionName.idle, true);
}
--
Gitblit v1.8.0