From 8f983d0dab26becb6b85dbbb616fde21c3ad8f02 Mon Sep 17 00:00:00 2001 From: yyl <yyl> Date: 星期三, 20 八月 2025 18:40:23 +0800 Subject: [PATCH] 125 【战斗】战斗系统 --- Main/System/Battle/Motion/MotionBase.cs | 149 ++++++++++++++++++++++++++++++++++--------------- 1 files changed, 102 insertions(+), 47 deletions(-) diff --git a/Main/System/Battle/Motion/MotionBase.cs b/Main/System/Battle/Motion/MotionBase.cs index 99e5e3b..1e5b32f 100644 --- a/Main/System/Battle/Motion/MotionBase.cs +++ b/Main/System/Battle/Motion/MotionBase.cs @@ -10,7 +10,7 @@ /// </summary> public class MotionBase { - public static float MotionTimeScale = 2f; + public static float MotionTimeScale = 1f; public static List<string> AttackMotionList = new List<string> { @@ -133,88 +133,143 @@ return currentTrackEntry; } - public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, Action onComplete = null, Action onBeginPhaseEnd = null, Action onActivePhaseEnd = null) + public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, Action _onComplete = null) { + // 鍙傛暟鏍¢獙 if (skillConfig == null) { Debug.LogError("鎶�鑳介厤缃负绌猴紝鏃犳硶鎾斁鎶�鑳藉姩鐢�"); return null; } + if (spineAnimationState == null || skeleton == null) + { + Debug.LogError("SkeletonGraphic鎴朅nimationState鏈垵濮嬪寲锛屾棤娉曟挱鏀炬妧鑳藉姩鐢�"); + return null; + } - return PlayAnimation(skillConfig.SkillMotionName, skillConfig.StartupFrames, skillConfig.ActiveFrames, skillConfig.LoopCount, - onComplete, onBeginPhaseEnd, onActivePhaseEnd); - } + // 鑾峰彇鍔ㄧ敾 + Spine.Animation anim = skeleton.Data.FindAnimation(skillConfig.SkillMotionName); + if (anim == null) + { + Debug.LogError($"鎵句笉鍒板姩鐢�: {skillConfig.SkillMotionName}"); + return null; + } - public virtual Spine.TrackEntry PlayAnimation( - string animationName, - int loopBeginFrame, - int loopEndFrame, - int loopTimes, - Action _onComplete = null, - Action onBeginPhaseEnd = null, // 鍓嶆憞缁撴潫鍥炶皟 - Action onActivePhaseEnd = null // 涓憞缁撴潫鍥炶皟 - ) - { - if (spineAnimationState == null || skeleton == null) return null; - - var anim = skeleton.Data.FindAnimation(animationName); - if (anim == null) return null; - + // 鍏抽敭甯у弬鏁� float fps = BattleConst.skillMotionFps; - float beginTime = loopBeginFrame / fps; - float endTime = loopEndFrame / fps; + float middleBeginTime = skillConfig.StartupFrames / fps; + int loopCount = skillConfig.LoopCount; + int[] activeFrames = skillConfig.ActiveFrames; + int activeFrameCount = activeFrames.Length; + float recoveryFrameTime = skillConfig.RecoveryFrames / fps; - currentTrackEntry = spineAnimationState.SetAnimation(0, anim, false); + // 鎾斁鍔ㄧ敾 + var skillTrackEntry = spineAnimationState.SetAnimation(0, anim, false); + currentTrackEntry = skillTrackEntry; + // 浜嬩欢鐘舵�� int curLoop = 0; - bool finished = false; + bool isFinish = false; bool beginPhaseTriggered = false; + bool finalFrameStarted = false; + bool finalFrameEnded = false; + bool middleFrameStarted = false; + bool[] triggeredActiveFrame = new bool[activeFrameCount]; + // 鎶�鑳藉紑濮� + skillBase.OnSkillStart(); + + // 鍔ㄧ敾甯ф洿鏂板鐞� Spine.Unity.UpdateBonesDelegate updateLocalHandler = null; updateLocalHandler = (ISkeletonAnimation animated) => { - if (finished) return; - var entry = currentTrackEntry; - if (entry == null || entry.Animation != anim) - { - skeletonGraphic.UpdateLocal -= updateLocalHandler; - return; - } + if (isFinish) return; + float trackTime = skillTrackEntry.TrackTime; // 鍓嶆憞缁撴潫锛堝彧瑙﹀彂涓�娆★級 - if (!beginPhaseTriggered && entry.TrackTime >= beginTime) + if (!beginPhaseTriggered && trackTime >= middleBeginTime && curLoop == 0) { beginPhaseTriggered = true; - onBeginPhaseEnd?.Invoke(); + skillBase.OnStartSkillFrameEnd(); } - // 涓憞缁撴潫锛堟瘡娆″埌endTime閮借Е鍙戯級 - if (entry.TrackTime >= endTime) + // 涓憞寮�濮嬶紙姣忚疆loop鐨勫紑濮嬶紝鍙Е鍙戜竴娆★級 + if (!middleFrameStarted && trackTime >= middleBeginTime && curLoop < loopCount) { - onActivePhaseEnd?.Invoke(); + middleFrameStarted = true; + skillBase.OnMiddleFrameStart(curLoop); + } - curLoop++; - if (curLoop >= loopTimes) + // 澶氭鏀诲嚮甯цЕ鍙� + for (int hitIndex = 0; hitIndex < activeFrameCount; hitIndex++) + { + float activeFrameTime = activeFrames[hitIndex] / fps; + if (!triggeredActiveFrame[hitIndex] && trackTime >= activeFrameTime) { - finished = true; - skeletonGraphic.UpdateLocal -= updateLocalHandler; - _onComplete?.Invoke(); - return; + skillBase.OnMiddleFrameEnd(curLoop, hitIndex); + triggeredActiveFrame[hitIndex] = true; } - entry.TrackTime = beginTime; - beginPhaseTriggered = false; // 閲嶇疆锛屼笅涓�杞墠鎽囧彲鍐嶆瑙﹀彂 + } + + // 鍒ゆ柇鏄惁鎵�鏈塧ctiveFrame閮藉凡瑙﹀彂锛屽噯澶囪繘鍏ヤ笅涓�杞甽oop + bool allTriggered = true; + for (int i = 0; i < activeFrameCount; i++) + { + if (!triggeredActiveFrame[i]) + { + allTriggered = false; + break; + } + } + + // 杩涘叆涓嬩竴杞甽oop + if (allTriggered && curLoop < loopCount) + { + curLoop++; + Array.Clear(triggeredActiveFrame, 0, activeFrameCount); + middleFrameStarted = false; + + if (curLoop < loopCount) + { + // 閲嶆柊璁剧疆鍒扮涓�娆$殑涓憞鏃堕棿 + skillTrackEntry.TrackTime = middleBeginTime; + beginPhaseTriggered = false; + } + else + { + finalFrameStarted = false; + finalFrameEnded = false; + // 鏀跺熬闃舵鐢卞悗缁�昏緫澶勭悊 + } + } + + // 鏀跺熬闃舵锛歄nFinalFrameStart 鍜� OnFinalFrameEnd + if (curLoop >= loopCount) + { + if (!finalFrameStarted && trackTime >= recoveryFrameTime) + { + finalFrameStarted = true; + skillBase.OnFinalFrameStart(); + } + if (finalFrameStarted && !finalFrameEnded && trackTime >= recoveryFrameTime) + { + finalFrameEnded = true; + skillBase.OnFinalFrameEnd(); + skeletonGraphic.UpdateLocal -= updateLocalHandler; + isFinish = true; + } } }; - skeletonGraphic.UpdateLocal += updateLocalHandler; if (_onComplete != null && currentTrackEntry != null) { trackEntryCompleteDict[currentTrackEntry] = _onComplete; } - return currentTrackEntry; + skeletonGraphic.UpdateLocal += updateLocalHandler; + return skillTrackEntry; } - + /// <summary> /// 璁剧疆鍔ㄧ敾浜嬩欢鐩戝惉 -- Gitblit v1.8.0