From 1a30a307bc79d887139b4b90f40b274e344d2285 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期五, 31 十月 2025 15:06:43 +0800
Subject: [PATCH] 125 战斗 多技能同轨播放导致的动画不播放问题
---
Main/System/Battle/Motion/MotionBase.cs | 60 +++++++++++++++++++++++++++++++++++++++++++++++++-----------
1 files changed, 49 insertions(+), 11 deletions(-)
diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index 1b0fe44..ba71c8d 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -23,6 +23,7 @@
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 SkeletonIllusionShadow illusionShadow;
private bool playingSkillAnim = false;
@@ -61,6 +62,7 @@
public virtual void Release()
{
trackEntryCallbacks.Clear();
+ activeSkillTracks.Clear();
if (animState != null)
{
animState.Complete -= OnAnimationComplete;
@@ -107,7 +109,8 @@
return null;
}
- if (string.IsNullOrEmpty(skillConfig.SkillMotionName))
+ // 瀛愭妧鑳藉己鍒朵娇鐢ㄦ棤鍔ㄧ敾妯″紡锛屾垨鑰呭鏋滄病鏈夊姩鐢诲悕绉�
+ if (isSubSkill || string.IsNullOrEmpty(skillConfig.SkillMotionName))
{
PlaySkillNoAnim(skillConfig, skillBase, onComplete, isSubSkill);
return null;
@@ -133,11 +136,23 @@
int frameCount = activeFrames.Length;
float recoveryFrame = skillConfig.RecoveryFrames;
+ // 涓绘妧鑳界敤 track 0锛屽瓙鎶�鑳界敤 track 1
+ int trackIndex = isSubSkill ? 1 : 0;
Spine.TrackEntry skillTrack = null;
+
if (hasAnim)
{
- skillTrack = animState.SetAnimation(0, targetAnim, false);
- currentTrack = skillTrack;
+ skillTrack = animState.SetAnimation(trackIndex, targetAnim, false);
+ if (null == skillTrack || skillConfig.SkillID == 3008020)
+ {
+ Debug.Break();
+ }
+
+ // 鍙湁涓绘妧鑳芥墠鏇存柊 currentTrack
+ if (!isSubSkill)
+ currentTrack = skillTrack;
+
+ activeSkillTracks[trackIndex] = skillTrack;
}
playingSkillAnim = true;
@@ -149,7 +164,7 @@
// 鏂板锛氳褰曟妧鑳藉紑濮嬫椂鐨� pausedAccumulated 鍩虹嚎锛岀敤浜庡悗缁绠楄鎶�鑳借嚜韬殑鏆傚仠鏃堕暱
float pausedAccumulatedAtStart = pausedAccumulated;
- // startTime 琛ㄧず鎶�鑳解�滄湰鍦伴�昏緫鏃堕棿鈥濈殑璧风偣锛堜互 Time.time 涓哄熀鍑嗭級
+ // startTime 琛ㄧず鎶�鑳�"鏈湴閫昏緫鏃堕棿"鐨勮捣鐐癸紙浠� Time.time 涓哄熀鍑嗭級
float startTime = hasAnim ? 0f : Time.time;
skillBase.OnSkillStart();
@@ -160,7 +175,16 @@
if (skillBase.IsFinished())
{
// 娓呯悊骞堕��鍑猴紙淇濊瘉鐘舵�佷竴鑷达級
- playingSkillAnim = false;
+ if (skillTrack != null && activeSkillTracks.ContainsKey(trackIndex))
+ {
+ if (activeSkillTracks[trackIndex] == skillTrack)
+ activeSkillTracks.Remove(trackIndex);
+ }
+
+ // 鍙湁褰撴病鏈夊叾浠栨椿璺冩妧鑳芥椂鎵嶅浣� playingSkillAnim
+ if (activeSkillTracks.Count == 0)
+ playingSkillAnim = false;
+
RemoveAction(frameHandler);
return;
}
@@ -173,7 +197,7 @@
}
else
{
- // 浣跨敤 pausedAccumulatedAtStart 鏉ヨ绠椻�滆繖涓妧鑳借嚜寮�濮嬩互鏉ョ殑鏆傚仠鎬绘椂闀库��
+ // 浣跨敤 pausedAccumulatedAtStart 鏉ヨ绠�"杩欎釜鎶�鑳借嚜寮�濮嬩互鏉ョ殑鏆傚仠鎬绘椂闀�"
float adjustedTime = Time.time;
float thisSkillPaused = pausedAccumulated - pausedAccumulatedAtStart;
if (thisSkillPaused < 0f) thisSkillPaused = 0f; // 淇濋櫓闃叉姢
@@ -186,14 +210,16 @@
if (hasAnim)
{
- if (currentTrack != skillTrack)
+ // 妫�鏌ュ綋鍓嶈建閬撴槸鍚﹁鏂版妧鑳借鐩�
+ if (!activeSkillTracks.ContainsKey(trackIndex) || activeSkillTracks[trackIndex] != skillTrack)
{
Debug.LogError("鎶�鑳藉姩鐢昏鎵撴柇锛屽己鍒剁粨鏉� " + skillConfig.SkillID);
skillBase.ForceFinished();
// 娓呯悊骞剁‘淇濈姸鎬佸浣�
RemoveAction(frameHandler);
- playingSkillAnim = false;
+ if (activeSkillTracks.Count == 0)
+ playingSkillAnim = false;
return;
}
@@ -203,7 +229,10 @@
Debug.LogError("鎶�鑳藉姩鐢绘挱鏀惧け璐ワ紝寮哄埗缁撴潫 " + skillConfig.SkillID);
skillBase.ForceFinished();
RemoveAction(frameHandler);
- playingSkillAnim = false;
+ if (activeSkillTracks.ContainsKey(trackIndex))
+ activeSkillTracks.Remove(trackIndex);
+ if (activeSkillTracks.Count == 0)
+ playingSkillAnim = false;
return;
}
}
@@ -273,8 +302,16 @@
{
finalEnded = true;
- // 涓�瀹氳鎶� playingSkillAnim 澶嶄綅锛堟棤璁烘槸鍚︽槸瀛愭妧鑳斤級锛屽惁鍒欏彲鑳藉鑷村悗缁姩鐢昏鎷︽埅
- playingSkillAnim = false;
+ // 娓呯悊鎶�鑳借建閬�
+ if (skillTrack != null && activeSkillTracks.ContainsKey(trackIndex))
+ {
+ if (activeSkillTracks[trackIndex] == skillTrack)
+ activeSkillTracks.Remove(trackIndex);
+ }
+
+ // 鍙湁褰撴病鏈夊叾浠栨椿璺冩妧鑳芥椂鎵嶅浣� playingSkillAnim
+ if (activeSkillTracks.Count == 0)
+ playingSkillAnim = false;
RemoveAction(frameHandler);
onComplete?.Invoke();
@@ -402,6 +439,7 @@
{
trackEntryCallbacks.Clear();
runningActions.Clear();
+ activeSkillTracks.Clear();
playingSkillAnim = false;
PlayAnimation(MotionName.idle, true);
}
--
Gitblit v1.8.0