| | |
| | | /// <returns>动画轨道条目</returns> |
| | | public virtual Spine.TrackEntry PlayAnimation(MotionName motionName, bool loop, Action _onComplete = null) |
| | | { |
| | | if (isPlaySkillAnimation) |
| | | { |
| | | return null; |
| | | } |
| | | |
| | | if (spineAnimationState == null) return null; |
| | | |
| | | // 如果当前动画未完成 |
| | |
| | | runActionList.Remove(_action); |
| | | } |
| | | |
| | | private bool isPlaySkillAnimation = false; |
| | | |
| | | public Spine.TrackEntry PlaySkillAnimation(SkillConfig skillConfig, SkillBase skillBase, Action _onComplete = null) |
| | | { |
| | | // 参数校验 |
| | | if (skillConfig == null) |
| | | { |
| | | BattleDebug.LogError("技能配置为空,无法播放技能动画"); |
| | | Debug.LogError("技能配置为空,无法播放技能动画"); |
| | | return null; |
| | | } |
| | | if (spineAnimationState == null || skeleton == null) |
| | | { |
| | | BattleDebug.LogError("SkeletonGraphic或AnimationState未初始化,无法播放技能动画"); |
| | | Debug.LogError("SkeletonGraphic或AnimationState未初始化,无法播放技能动画"); |
| | | return null; |
| | | } |
| | | |
| | |
| | | // 获取动画 |
| | | if (anim == null) |
| | | { |
| | | BattleDebug.LogError($"找不到动画: {skillConfig.SkillMotionName}"); |
| | | Debug.LogError($"找不到动画: {skillConfig.SkillMotionName}"); |
| | | _onComplete?.Invoke(); |
| | | return null; |
| | | } |
| | |
| | | |
| | | // 播放动画 |
| | | var skillTrackEntry = spineAnimationState.SetAnimation(0, anim, false); |
| | | isPlaySkillAnimation = true; |
| | | currentTrackEntry = skillTrackEntry; |
| | | |
| | | // 事件状态 |
| | | int curLoop = 0; |
| | | bool isFinish = false; |
| | | bool beginPhaseTriggered = false; |
| | | bool finalFrameStarted = false; |
| | | bool finalFrameEnded = false; |
| | |
| | | |
| | | updateLocalHandler = () => |
| | | { |
| | | if (isFinish) return; |
| | | |
| | | float frame = (skillTrackEntry.TrackTime * skillTrackEntry.TimeScale * (float)BattleConst.skillMotionFps); |
| | | |
| | | if (currentTrackEntry != skillTrackEntry) |
| | | { |
| | | Debug.LogError("技能动画被打断,强制结束 " + skillConfig.SkillID + " last animation : " + (currentTrackEntry != null && currentTrackEntry.Animation != null ? currentTrackEntry.Animation.Name : "null")); |
| | | } |
| | | |
| | | if (skillTrackEntry.TrackTime == 0) |
| | | { |
| | | failCallbackTimes++; |
| | | } |
| | | |
| | | |
| | | if (failCallbackTimes > 100) |
| | | { |
| | | Debug.LogError("技能动画播放失败,回调异常,强制结束 " + skillConfig.SkillID + " 导致错误的原因是技能帧配置得太久导致技能动作结束了事件还没结束"); |
| | | skillBase.ForceFinished(); |
| | | RemoveRunAction(updateLocalHandler); |
| | | isFinish = true; |
| | | isPlaySkillAnimation = true; |
| | | return; |
| | | } |
| | | |
| | |
| | | if (finalFrameStarted && !finalFrameEnded && frame >= recoveryFrame) |
| | | { |
| | | finalFrameEnded = true; |
| | | skillBase.OnFinalFrameEnd(); |
| | | isPlaySkillAnimation = false; |
| | | RemoveRunAction(updateLocalHandler); |
| | | isFinish = true; |
| | | _onComplete?.Invoke(); |
| | | skillBase.OnFinalFrameEnd(); |
| | | } |
| | | } |
| | | }; |
| | | |
| | | if (_onComplete != null && currentTrackEntry != null) |
| | | { |
| | | trackEntryCompleteDict[currentTrackEntry] = _onComplete; |
| | | } |
| | | |
| | | RunAction(updateLocalHandler); |
| | | |