mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-03 22:29:13 +08:00
[unity] Fixed root motion components ignoring split translate timelines. Closes #1997.
This commit is contained in:
parent
3044ef1156
commit
bb7804ac9e
@ -196,24 +196,39 @@ namespace Spine.Unity {
|
|||||||
public Vector2 GetAnimationRootMotion (float startTime, float endTime,
|
public Vector2 GetAnimationRootMotion (float startTime, float endTime,
|
||||||
Animation animation) {
|
Animation animation) {
|
||||||
|
|
||||||
var timeline = animation.FindTranslateTimelineForBone(rootMotionBoneIndex);
|
TranslateTimeline timeline = animation.FindTranslateTimelineForBone(rootMotionBoneIndex);
|
||||||
if (timeline != null) {
|
if (timeline != null) {
|
||||||
return GetTimelineMovementDelta(startTime, endTime, timeline, animation);
|
return GetTimelineMovementDelta(startTime, endTime, timeline, animation);
|
||||||
}
|
}
|
||||||
|
TranslateXTimeline xTimeline = animation.FindTimelineForBone<TranslateXTimeline>(rootMotionBoneIndex);
|
||||||
|
TranslateYTimeline yTimeline = animation.FindTimelineForBone<TranslateYTimeline>(rootMotionBoneIndex);
|
||||||
|
if (xTimeline != null || yTimeline != null) {
|
||||||
|
return GetTimelineMovementDelta(startTime, endTime, xTimeline, yTimeline, animation);
|
||||||
|
}
|
||||||
return Vector2.zero;
|
return Vector2.zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
public RootMotionInfo GetAnimationRootMotionInfo (Animation animation, float currentTime) {
|
public RootMotionInfo GetAnimationRootMotionInfo (Animation animation, float currentTime) {
|
||||||
RootMotionInfo rootMotion = new RootMotionInfo();
|
RootMotionInfo rootMotion = new RootMotionInfo();
|
||||||
var timeline = animation.FindTranslateTimelineForBone(rootMotionBoneIndex);
|
float duration = animation.Duration;
|
||||||
|
float mid = duration * 0.5f;
|
||||||
|
rootMotion.timeIsPastMid = currentTime > mid;
|
||||||
|
TranslateTimeline timeline = animation.FindTranslateTimelineForBone(rootMotionBoneIndex);
|
||||||
if (timeline != null) {
|
if (timeline != null) {
|
||||||
float duration = animation.Duration;
|
|
||||||
float mid = duration * 0.5f;
|
|
||||||
rootMotion.start = timeline.Evaluate(0);
|
rootMotion.start = timeline.Evaluate(0);
|
||||||
rootMotion.current = timeline.Evaluate(currentTime);
|
rootMotion.current = timeline.Evaluate(currentTime);
|
||||||
rootMotion.mid = timeline.Evaluate(mid);
|
rootMotion.mid = timeline.Evaluate(mid);
|
||||||
rootMotion.end = timeline.Evaluate(duration);
|
rootMotion.end = timeline.Evaluate(duration);
|
||||||
rootMotion.timeIsPastMid = currentTime > mid;
|
return rootMotion;
|
||||||
|
}
|
||||||
|
TranslateXTimeline xTimeline = animation.FindTimelineForBone<TranslateXTimeline>(rootMotionBoneIndex);
|
||||||
|
TranslateYTimeline yTimeline = animation.FindTimelineForBone<TranslateYTimeline>(rootMotionBoneIndex);
|
||||||
|
if (xTimeline != null || yTimeline != null) {
|
||||||
|
rootMotion.start = TimelineExtensions.Evaluate(xTimeline, yTimeline, 0);
|
||||||
|
rootMotion.current = TimelineExtensions.Evaluate(xTimeline, yTimeline, currentTime);
|
||||||
|
rootMotion.mid = TimelineExtensions.Evaluate(xTimeline, yTimeline, mid);
|
||||||
|
rootMotion.end = TimelineExtensions.Evaluate(xTimeline, yTimeline, duration);
|
||||||
|
return rootMotion;
|
||||||
}
|
}
|
||||||
return rootMotion;
|
return rootMotion;
|
||||||
}
|
}
|
||||||
@ -232,6 +247,24 @@ namespace Spine.Unity {
|
|||||||
return currentDelta;
|
return currentDelta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vector2 GetTimelineMovementDelta (float startTime, float endTime,
|
||||||
|
TranslateXTimeline xTimeline, TranslateYTimeline yTimeline, Animation animation) {
|
||||||
|
|
||||||
|
Vector2 currentDelta;
|
||||||
|
if (startTime > endTime) // Looped
|
||||||
|
currentDelta =
|
||||||
|
(TimelineExtensions.Evaluate(xTimeline, yTimeline, animation.Duration)
|
||||||
|
- TimelineExtensions.Evaluate(xTimeline, yTimeline, startTime))
|
||||||
|
+ (TimelineExtensions.Evaluate(xTimeline, yTimeline, endTime)
|
||||||
|
- TimelineExtensions.Evaluate(xTimeline, yTimeline, 0));
|
||||||
|
else if (startTime != endTime) // Non-looped
|
||||||
|
currentDelta = TimelineExtensions.Evaluate(xTimeline, yTimeline, endTime)
|
||||||
|
- TimelineExtensions.Evaluate(xTimeline, yTimeline, startTime);
|
||||||
|
else
|
||||||
|
currentDelta = Vector2.zero;
|
||||||
|
return currentDelta;
|
||||||
|
}
|
||||||
|
|
||||||
void GatherTopLevelBones () {
|
void GatherTopLevelBones () {
|
||||||
topLevelBones.Clear();
|
topLevelBones.Clear();
|
||||||
var skeleton = skeletonComponent.Skeleton;
|
var skeleton = skeletonComponent.Skeleton;
|
||||||
|
|||||||
@ -52,6 +52,27 @@ namespace Spine.Unity.AnimationTools {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>Evaluates the resulting value of a pair of split translate timelines at a given time.
|
||||||
|
/// SkeletonData can be accessed from Skeleton.Data or from SkeletonDataAsset.GetSkeletonData.
|
||||||
|
/// If no SkeletonData is given, values are returned as difference to setup pose
|
||||||
|
/// instead of absolute values.</summary>
|
||||||
|
public static Vector2 Evaluate (TranslateXTimeline xTimeline, TranslateYTimeline yTimeline,
|
||||||
|
float time, SkeletonData skeletonData = null) {
|
||||||
|
|
||||||
|
float x = 0, y = 0;
|
||||||
|
if (xTimeline != null && time > xTimeline.Frames[0]) x = xTimeline.GetCurveValue(time);
|
||||||
|
if (yTimeline != null && time > yTimeline.Frames[0]) y = yTimeline.GetCurveValue(time);
|
||||||
|
|
||||||
|
if (skeletonData == null) {
|
||||||
|
return new Vector2(x, y);
|
||||||
|
} else {
|
||||||
|
var bonesItems = skeletonData.Bones.Items;
|
||||||
|
BoneData boneDataX = bonesItems[xTimeline.BoneIndex];
|
||||||
|
BoneData boneDataY = bonesItems[yTimeline.BoneIndex];
|
||||||
|
return new Vector2(boneDataX.X + x, boneDataY.Y + y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>Gets the translate timeline for a given boneIndex.
|
/// <summary>Gets the translate timeline for a given boneIndex.
|
||||||
/// You can get the boneIndex using SkeletonData.FindBoneIndex.
|
/// You can get the boneIndex using SkeletonData.FindBoneIndex.
|
||||||
/// The root bone is always boneIndex 0.
|
/// The root bone is always boneIndex 0.
|
||||||
@ -67,5 +88,18 @@ namespace Spine.Unity.AnimationTools {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>Gets the IBoneTimeline timeline of a given type for a given boneIndex.
|
||||||
|
/// You can get the boneIndex using SkeletonData.FindBoneIndex.
|
||||||
|
/// The root bone is always boneIndex 0.
|
||||||
|
/// This will return null if a timeline of the given type is not found.</summary>
|
||||||
|
public static T FindTimelineForBone<T> (this Animation a, int boneIndex) where T : class, IBoneTimeline {
|
||||||
|
foreach (var timeline in a.Timelines) {
|
||||||
|
T translateTimeline = timeline as T;
|
||||||
|
if (translateTimeline != null && translateTimeline.BoneIndex == boneIndex)
|
||||||
|
return translateTimeline;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user