| | |
| | | public Action OnAttackAnimationComplete; |
| | | public Action OnHitAnimationComplete; |
| | | public Action<string> onAnimationComplete; |
| | | |
| | | private List<Action> runActionList = new List<Action>(); |
| | | |
| | | #region 组件引用 |
| | | |
| | | |
| | | protected SkeletonGraphic skeletonGraphic; |
| | | protected Spine.AnimationState spineAnimationState; |
| | | protected Spine.Skeleton skeleton; |
| | |
| | | #endregion |
| | | |
| | | private Spine.TrackEntry currentTrackEntry; |
| | | |
| | | |
| | | #region 初始化方法 |
| | | |
| | |
| | | return currentTrackEntry; |
| | | } |
| | | |
| | | private void RunAction(Action _action) |
| | | { |
| | | runActionList.Add(_action); |
| | | } |
| | | |
| | | private void RemoveRunAction(Action _action) |
| | | { |
| | | runActionList.Remove(_action); |
| | | } |
| | | |
| | | public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, Action _onComplete = null) |
| | | { |
| | | // 参数校验 |
| | |
| | | } |
| | | |
| | | // 关键帧参数 |
| | | float fps = BattleConst.skillMotionFps; |
| | | float middleBeginTime = skillConfig.StartupFrames / fps; |
| | | int loopCount = skillConfig.LoopCount; |
| | | int[] activeFrames = skillConfig.ActiveFrames; |
| | | int activeFrameCount = activeFrames.Length; |
| | | float recoveryFrameTime = skillConfig.RecoveryFrames / fps; |
| | | float recoveryFrame = skillConfig.RecoveryFrames; |
| | | |
| | | // 播放动画 |
| | | var skillTrackEntry = spineAnimationState.SetAnimation(0, anim, false); |
| | |
| | | skillBase.OnSkillStart(); |
| | | |
| | | // 动画帧更新处理 |
| | | Spine.Unity.UpdateBonesDelegate updateLocalHandler = null; |
| | | updateLocalHandler = (ISkeletonAnimation animated) => |
| | | int triggerMFEndCount = 0; |
| | | Action updateLocalHandler = null; |
| | | updateLocalHandler = () => |
| | | { |
| | | if (isFinish) return; |
| | | float trackTime = skillTrackEntry.TrackTime; |
| | | |
| | | float frame = (skillTrackEntry.TrackTime * (float)BattleConst.skillMotionFps); |
| | | |
| | | // 前摇结束(只触发一次) |
| | | if (!beginPhaseTriggered && trackTime >= middleBeginTime && curLoop == 0) |
| | | if (!beginPhaseTriggered && frame >= skillConfig.StartupFrames && curLoop == 0) |
| | | { |
| | | beginPhaseTriggered = true; |
| | | skillBase.OnStartSkillFrameEnd(); |
| | | } |
| | | |
| | | // 中摇开始(每轮loop的开始,只触发一次) |
| | | if (!middleFrameStarted && trackTime >= middleBeginTime && curLoop <= loopCount) |
| | | if (!middleFrameStarted && frame >= skillConfig.StartupFrames && curLoop <= loopCount) |
| | | { |
| | | middleFrameStarted = true; |
| | | skillBase.OnMiddleFrameStart(curLoop); |
| | |
| | | // 多段攻击帧触发 |
| | | for (int hitIndex = 0; hitIndex < activeFrameCount; hitIndex++) |
| | | { |
| | | float activeFrameTime = activeFrames[hitIndex] / fps; |
| | | if (!triggeredActiveFrame[hitIndex] && trackTime >= activeFrameTime) |
| | | float activeFrame = activeFrames[hitIndex]; |
| | | if (!triggeredActiveFrame[hitIndex] && frame >= activeFrame) |
| | | { |
| | | skillBase.OnMiddleFrameEnd(curLoop, hitIndex); |
| | | skillBase.OnMiddleFrameEnd(curLoop, triggerMFEndCount++); |
| | | triggeredActiveFrame[hitIndex] = true; |
| | | } |
| | | } |
| | |
| | | if (curLoop < loopCount) |
| | | { |
| | | // 重新设置到第一次的中摇时间 |
| | | skillTrackEntry.TrackTime = middleBeginTime; |
| | | skillTrackEntry.TrackTime = skillConfig.StartupFrames / BattleConst.skillMotionFps; |
| | | beginPhaseTriggered = false; |
| | | } |
| | | else |
| | |
| | | // 收尾阶段:OnFinalFrameStart 和 OnFinalFrameEnd |
| | | if (curLoop >= loopCount) |
| | | { |
| | | if (!finalFrameStarted && trackTime >= recoveryFrameTime) |
| | | if (!finalFrameStarted && frame >= recoveryFrame) |
| | | { |
| | | finalFrameStarted = true; |
| | | skillBase.OnFinalFrameStart(); |
| | | } |
| | | if (finalFrameStarted && !finalFrameEnded && trackTime >= recoveryFrameTime) |
| | | if (finalFrameStarted && !finalFrameEnded && frame >= recoveryFrame) |
| | | { |
| | | finalFrameEnded = true; |
| | | skillBase.OnFinalFrameEnd(); |
| | | skeletonGraphic.UpdateLocal -= updateLocalHandler; |
| | | RemoveRunAction(updateLocalHandler); |
| | | isFinish = true; |
| | | } |
| | | } |
| | |
| | | trackEntryCompleteDict[currentTrackEntry] = _onComplete; |
| | | } |
| | | |
| | | skeletonGraphic.UpdateLocal += updateLocalHandler; |
| | | RunAction(updateLocalHandler); |
| | | |
| | | return skillTrackEntry; |
| | | } |
| | | |
| | |
| | | |
| | | public virtual void Run() |
| | | { |
| | | |
| | | for (int i = runActionList.Count - 1; i >= 0; i--) |
| | | { |
| | | runActionList[i]?.Invoke(); |
| | | } |
| | | } |
| | | |
| | | public virtual void Pause() |
| | |
| | | public void HaveRest() |
| | | { |
| | | trackEntryCompleteDict.Clear(); |
| | | runActionList.Clear(); |
| | | PlayAnimation(MotionName.idle, true); |
| | | } |
| | | |