| | |
| | | |
| | | public class MotionBase |
| | | { |
| | | public static float MotionTimeScale = 1f; |
| | | public float MotionTimeScale = 1f; |
| | | public static List<string> AttackMotionList = new List<string> |
| | | { |
| | | MotionName.attack.ToString().ToLower(), |
| | |
| | | public Action OnHitAnimationComplete; |
| | | private List<Action> runningActions = new List<Action>(); |
| | | |
| | | protected SkeletonAnimation skeletonAnim; |
| | | public SkeletonAnimation skeletonAnim; |
| | | protected Spine.AnimationState animState; |
| | | protected Spine.Skeleton skeleton; |
| | | protected float defaultMixDuration = 0f; |
| | | private Spine.TrackEntry currentTrack; |
| | | private SkeletonIllusionShadow illusionShadow; |
| | | private bool playingSkillAnim = false; |
| | | |
| | | private bool isUnderControl = false; |
| | | |
| | | private float pauseTime = 0f; |
| | | |
| | | private float resumeTime = 0f; |
| | | |
| | | public virtual void Init(SkeletonAnimation skelAnim) |
| | | { |
| | |
| | | } |
| | | |
| | | animState = skeletonAnim.AnimationState; |
| | | animState.TimeScale = MotionTimeScale; |
| | | skeletonAnim.timeScale = MotionTimeScale; |
| | | skeleton = skeletonAnim.Skeleton; |
| | | |
| | |
| | | private Spine.TrackEntry ExecuteSkillAnim(SkillConfig skillConfig, SkillBase skillBase, Action onComplete, |
| | | Spine.Animation targetAnim, bool hasAnim, bool isSubSkill) |
| | | { |
| | | bool isPangdeSkill = 1003020 == skillConfig.SkillID; |
| | | |
| | | int loopCount = skillConfig.LoopCount; |
| | | int[] activeFrames = skillConfig.ActiveFrames ?? new int[0]; |
| | | int frameCount = activeFrames.Length; |
| | |
| | | return; |
| | | } |
| | | |
| | | float currentFrame = 0f; |
| | | if (BattleConst.skillMotionFps > 0) |
| | | currentFrame = hasAnim ? (skillTrack.TrackTime * skillTrack.TimeScale * BattleConst.skillMotionFps) : ((Time.time - startTime) * MotionTimeScale * BattleConst.skillMotionFps); |
| | | float trackTime = 0f; //hasAnim ? skillTrack.TrackTime * skillTrack.TimeScale : (Time.time - startTime) * MotionTimeScale; |
| | | |
| | | if (hasAnim) |
| | | { |
| | | trackTime = skillTrack.TrackTime; |
| | | } |
| | | else |
| | | { |
| | | float adjustedTime = Time.time; |
| | | if (pauseTime > 0f && resumeTime > pauseTime) |
| | | { |
| | | startTime = startTime + (resumeTime - pauseTime); |
| | | pauseTime = 0f; |
| | | resumeTime = 0f; |
| | | } |
| | | trackTime = (adjustedTime - startTime) * MotionTimeScale; |
| | | } |
| | | |
| | | float currentFrame = trackTime * BattleConst.skillMotionFps; |
| | | |
| | | if (hasAnim) |
| | | { |
| | | if (currentTrack != skillTrack) |
| | | { |
| | | Debug.LogError("技能动画被打断,强制结束 " + skillConfig.SkillID); |
| | | skillBase.ForceFinished(); |
| | | RemoveAction(frameHandler); |
| | | playingSkillAnim = false; |
| | | return; |
| | | } |
| | | |
| | | if (skillTrack.TrackTime == 0) failCount++; |
| | | if (failCount > 100) |
| | |
| | | protected virtual void OnAnimationComplete(Spine.TrackEntry trackEntry) |
| | | { |
| | | if (trackEntry?.Animation?.Name == null) return; |
| | | |
| | | |
| | | string animName = trackEntry.Animation.Name.ToLower(); |
| | | |
| | | if (AttackMotionList.Contains(animName)) |
| | |
| | | OnHitAnimationComplete?.Invoke(); |
| | | PlayAnimation(MotionName.idle, true); |
| | | } |
| | | |
| | | |
| | | if (trackEntryCallbacks.TryGetValue(trackEntry, out var callback)) |
| | | { |
| | | trackEntryCallbacks.Remove(trackEntry); |
| | | callback?.Invoke(); |
| | | } |
| | | } |
| | | |
| | | public void SetControledAnimation() |
| | | { |
| | | // 受到硬控的时候,保持受击动画的第三帧,直到控制结束 或者最后一击死亡,移除控制效果后,恢复到待机状态或者播放死亡动画 |
| | | // 这里是受到硬控时候 需要表现的动画 |
| | | |
| | | var entry = PlayAnimation(MotionName.hit, false); |
| | | float threeFrameTrackTime = 3f / BattleConst.skillMotionFps; |
| | | entry.TrackTime = threeFrameTrackTime; |
| | | entry.TimeScale = 0; |
| | | |
| | | isUnderControl = true; |
| | | |
| | | } |
| | | |
| | | public void CancelControledAnimation() |
| | | { |
| | | // 硬控结束,恢复动画播放 |
| | | isUnderControl = false; |
| | | PlayAnimation(MotionName.idle, true); |
| | | } |
| | | |
| | | public virtual void Run() |
| | |
| | | |
| | | public virtual void Pause() |
| | | { |
| | | if (animState != null) animState.TimeScale = 0f; |
| | | if (skeletonAnim != null) skeletonAnim.timeScale = 0f; |
| | | pauseTime = Time.time; |
| | | } |
| | | |
| | | public virtual void Resume() |
| | | { |
| | | if (animState != null) animState.TimeScale = MotionTimeScale; |
| | | if (skeletonAnim != null) skeletonAnim.timeScale = MotionTimeScale; |
| | | resumeTime = Time.time; |
| | | } |
| | | |
| | | public void HaveRest() |
| | |
| | | public void SetSpeedRatio(float ratio) |
| | | { |
| | | MotionTimeScale = ratio; |
| | | if (animState != null) animState.TimeScale = ratio; |
| | | if (skeletonAnim != null) skeletonAnim.timeScale = ratio; |
| | | } |
| | | |
| | | public void ShowIllusionShadow(bool isVisible) |
| | | public void ShowIllusionShadow(bool isVisible, Color color = default) |
| | | { |
| | | if (illusionShadow != null) |
| | | { |
| | | illusionShadow.SetSkeletonAnimation(skeletonAnim); |
| | | illusionShadow.Show(isVisible); |
| | | illusionShadow.Show(isVisible, color); |
| | | } |
| | | } |
| | | } |