From 11ff5f8f5ef2a8dfc1bff5a657375148044d05c0 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期四, 30 十月 2025 18:59:50 +0800
Subject: [PATCH] 125 战斗 修复子技能因为暂停而导致的卡死
---
Main/System/Battle/Motion/MotionBase.cs | 60 +++++++++++++++++++++++++++++++++++++++++++++---------------
1 files changed, 45 insertions(+), 15 deletions(-)
diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs
index 5a29950..1b0fe44 100644
--- a/Main/System/Battle/Motion/MotionBase.cs
+++ b/Main/System/Battle/Motion/MotionBase.cs
@@ -29,8 +29,11 @@
private bool isUnderControl = false;
private float pauseTime = 0f;
-
private float resumeTime = 0f;
+
+ // 鏂板锛氱疮绉殏鍋滄椂闀匡紝鐢ㄤ簬瀵归潪鍔ㄧ敾璺緞(Time.time)杩涜绋冲畾鐨勬椂闂翠慨姝�
+ private float pausedAccumulated = 0f;
+ private float pauseStart = 0f;
public virtual void Init(SkeletonAnimation skelAnim)
{
@@ -142,7 +145,12 @@
int currentLoop = 0, triggerCount = 0, failCount = 0;
bool beginTriggered = false, finalStarted = false, finalEnded = false, middleStarted = false;
bool[] triggeredFrames = new bool[frameCount];
- float startTime = hasAnim ? 0 : Time.time;
+
+ // 鏂板锛氳褰曟妧鑳藉紑濮嬫椂鐨� pausedAccumulated 鍩虹嚎锛岀敤浜庡悗缁绠楄鎶�鑳借嚜韬殑鏆傚仠鏃堕暱
+ float pausedAccumulatedAtStart = pausedAccumulated;
+
+ // startTime 琛ㄧず鎶�鑳解�滄湰鍦伴�昏緫鏃堕棿鈥濈殑璧风偣锛堜互 Time.time 涓哄熀鍑嗭級
+ float startTime = hasAnim ? 0f : Time.time;
skillBase.OnSkillStart();
@@ -151,12 +159,13 @@
{
if (skillBase.IsFinished())
{
+ // 娓呯悊骞堕��鍑猴紙淇濊瘉鐘舵�佷竴鑷达級
playingSkillAnim = false;
RemoveAction(frameHandler);
return;
}
- float trackTime = 0f; //hasAnim ? skillTrack.TrackTime * skillTrack.TimeScale : (Time.time - startTime) * MotionTimeScale;
+ float trackTime = 0f;
if (hasAnim)
{
@@ -164,14 +173,13 @@
}
else
{
+ // 浣跨敤 pausedAccumulatedAtStart 鏉ヨ绠椻�滆繖涓妧鑳借嚜寮�濮嬩互鏉ョ殑鏆傚仠鎬绘椂闀库��
float adjustedTime = Time.time;
- if (pauseTime > 0f && resumeTime > pauseTime)
- {
- startTime = startTime + (resumeTime - pauseTime);
- pauseTime = 0f;
- resumeTime = 0f;
- }
- trackTime = (adjustedTime - startTime) * MotionTimeScale;
+ float thisSkillPaused = pausedAccumulated - pausedAccumulatedAtStart;
+ if (thisSkillPaused < 0f) thisSkillPaused = 0f; // 淇濋櫓闃叉姢
+
+ // 閫昏緫杩愯鏃堕棿 = 褰撳墠鏃堕棿 - startTime - 鏈妧鑳藉凡鏆傚仠鏃堕暱
+ trackTime = (adjustedTime - startTime - thisSkillPaused) * MotionTimeScale;
}
float currentFrame = trackTime * BattleConst.skillMotionFps;
@@ -182,11 +190,13 @@
{
Debug.LogError("鎶�鑳藉姩鐢昏鎵撴柇锛屽己鍒剁粨鏉� " + skillConfig.SkillID);
skillBase.ForceFinished();
+
+ // 娓呯悊骞剁‘淇濈姸鎬佸浣�
RemoveAction(frameHandler);
playingSkillAnim = false;
return;
}
-
+
if (skillTrack.TrackTime == 0) failCount++;
if (failCount > 100)
{
@@ -198,6 +208,7 @@
}
}
+ // 鍚勯樁娈靛洖璋冿紙鍘熸湁閫昏緫锛�
if (!beginTriggered && currentFrame >= skillConfig.StartupFrames && currentLoop == 0)
{
beginTriggered = true;
@@ -232,9 +243,15 @@
if (BattleConst.skillMotionFps > 0)
{
if (hasAnim)
+ {
skillTrack.TrackTime = skillConfig.StartupFrames / BattleConst.skillMotionFps;
+ }
else
+ {
+ // 涓轰笅涓� loop 閲嶇疆 startTime锛屽苟涓旀洿鏂� pausedAccumulatedAtStart锛堜互淇濇寔鍩虹嚎锛�
startTime = Time.time - (skillConfig.StartupFrames / BattleConst.skillMotionFps);
+ pausedAccumulatedAtStart = pausedAccumulated;
+ }
}
beginTriggered = false;
}
@@ -255,10 +272,10 @@
if (finalStarted && !finalEnded && currentFrame >= recoveryFrame)
{
finalEnded = true;
- if (!isSubSkill)
- {
- playingSkillAnim = false;
- }
+
+ // 涓�瀹氳鎶� playingSkillAnim 澶嶄綅锛堟棤璁烘槸鍚︽槸瀛愭妧鑳斤級锛屽惁鍒欏彲鑳藉鑷村悗缁姩鐢昏鎷︽埅
+ playingSkillAnim = false;
+
RemoveAction(frameHandler);
onComplete?.Invoke();
skillBase.OnFinalFrameEnd();
@@ -359,12 +376,25 @@
public virtual void Pause()
{
if (skeletonAnim != null) skeletonAnim.timeScale = 0f;
+
+ // 璁板綍鍗曟鏆傚仠寮�濮嬫椂鍒�
+ pauseStart = Time.time;
+ // 鍏煎鏃у瓧娈碉紙淇濈暀浣嗕笉鍐嶇敤浜庣疮绉�昏緫锛�
pauseTime = Time.time;
}
public virtual void Resume()
{
if (skeletonAnim != null) skeletonAnim.timeScale = MotionTimeScale;
+
+ // 绱Н鏆傚仠鏃堕暱锛堝鏋滄浘璁板綍杩� pauseStart锛�
+ if (pauseStart > 0f)
+ {
+ pausedAccumulated += (Time.time - pauseStart);
+ pauseStart = 0f;
+ }
+
+ // 淇濇寔鏃у瓧娈典互鍏煎鐜版湁浠g爜锛堜絾瀹為檯鏃堕棿淇浣跨敤 pausedAccumulated锛�
resumeTime = Time.time;
}
--
Gitblit v1.8.0