mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-08 11:46:53 +08:00
Merge branch '3.6' into 3.7-beta
This commit is contained in:
commit
cbc8231b18
@ -137,7 +137,16 @@ namespace Spine.Unity {
|
|||||||
if (skeletonTransformIsParent) {
|
if (skeletonTransformIsParent) {
|
||||||
// Recommended setup: Use local transform properties if Spine GameObject is the immediate parent
|
// Recommended setup: Use local transform properties if Spine GameObject is the immediate parent
|
||||||
thisTransform.localPosition = new Vector3(bone.worldX, bone.worldY, followZPosition ? 0f : thisTransform.localPosition.z);
|
thisTransform.localPosition = new Vector3(bone.worldX, bone.worldY, followZPosition ? 0f : thisTransform.localPosition.z);
|
||||||
if (followBoneRotation) thisTransform.localRotation = bone.GetQuaternion();
|
if (followBoneRotation) {
|
||||||
|
var halfRotation = Mathf.Atan2(bone.c, bone.a) * 0.5f;
|
||||||
|
if (followLocalScale && bone.scaleX < 0) // Negate rotation from negative scaleX. Don't use negative determinant. local scaleY doesn't factor into used rotation.
|
||||||
|
halfRotation += Mathf.PI * 0.5f;
|
||||||
|
|
||||||
|
var q = default(Quaternion);
|
||||||
|
q.z = Mathf.Sin(halfRotation);
|
||||||
|
q.w = Mathf.Cos(halfRotation);
|
||||||
|
thisTransform.localRotation = q;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// For special cases: Use transform world properties if transform relationship is complicated
|
// For special cases: Use transform world properties if transform relationship is complicated
|
||||||
Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f));
|
Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f));
|
||||||
@ -154,11 +163,12 @@ namespace Spine.Unity {
|
|||||||
|
|
||||||
if (followBoneRotation) {
|
if (followBoneRotation) {
|
||||||
Vector3 worldRotation = skeletonTransform.rotation.eulerAngles;
|
Vector3 worldRotation = skeletonTransform.rotation.eulerAngles;
|
||||||
|
if (followLocalScale && bone.scaleX < 0) boneWorldRotation += 180f;
|
||||||
#if UNITY_5_6_OR_NEWER
|
#if UNITY_5_6_OR_NEWER
|
||||||
thisTransform.SetPositionAndRotation(targetWorldPosition, Quaternion.Euler(worldRotation.x, worldRotation.y, skeletonTransform.rotation.eulerAngles.z + boneWorldRotation));
|
thisTransform.SetPositionAndRotation(targetWorldPosition, Quaternion.Euler(worldRotation.x, worldRotation.y, worldRotation.z + boneWorldRotation));
|
||||||
#else
|
#else
|
||||||
thisTransform.position = targetWorldPosition;
|
thisTransform.position = targetWorldPosition;
|
||||||
thisTransform.rotation = Quaternion.Euler(worldRotation.x, worldRotation.y, skeletonTransform.rotation.eulerAngles.z + bone.WorldRotationX);
|
thisTransform.rotation = Quaternion.Euler(worldRotation.x, worldRotation.y, worldRotation.z + bone.WorldRotationX);
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
thisTransform.position = targetWorldPosition;
|
thisTransform.position = targetWorldPosition;
|
||||||
|
|||||||
@ -28,7 +28,9 @@
|
|||||||
* POSSIBILITY OF SUCH DAMAGE.
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
// Contributed by: Mitch Thompson
|
#if UNITY_5_6_OR_NEWER
|
||||||
|
#define UNITY_CLIPINFOCACHE
|
||||||
|
#endif
|
||||||
|
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -116,21 +118,29 @@ namespace Spine.Unity {
|
|||||||
readonly Dictionary<int, Spine.Animation> animationTable = new Dictionary<int, Spine.Animation>(IntEqualityComparer.Instance);
|
readonly Dictionary<int, Spine.Animation> animationTable = new Dictionary<int, Spine.Animation>(IntEqualityComparer.Instance);
|
||||||
readonly Dictionary<AnimationClip, int> clipNameHashCodeTable = new Dictionary<AnimationClip, int>(AnimationClipEqualityComparer.Instance);
|
readonly Dictionary<AnimationClip, int> clipNameHashCodeTable = new Dictionary<AnimationClip, int>(AnimationClipEqualityComparer.Instance);
|
||||||
readonly List<Animation> previousAnimations = new List<Animation>();
|
readonly List<Animation> previousAnimations = new List<Animation>();
|
||||||
#if UNITY_2017_1_OR_NEWER
|
#if UNITY_CLIPINFOCACHE
|
||||||
readonly List<AnimatorClipInfo> clipInfoCache = new List<AnimatorClipInfo>();
|
readonly List<AnimatorClipInfo> clipInfoCache = new List<AnimatorClipInfo>();
|
||||||
readonly List<AnimatorClipInfo> nextClipInfoCache = new List<AnimatorClipInfo>();
|
readonly List<AnimatorClipInfo> nextClipInfoCache = new List<AnimatorClipInfo>();
|
||||||
#endif
|
#endif
|
||||||
Animator animator;
|
|
||||||
|
|
||||||
|
Animator animator;
|
||||||
public Animator Animator { get { return this.animator; } }
|
public Animator Animator { get { return this.animator; } }
|
||||||
|
|
||||||
public void Initialize (Animator animator, SkeletonDataAsset skeletonDataAsset) {
|
public void Initialize (Animator animator, SkeletonDataAsset skeletonDataAsset) {
|
||||||
this.animator = animator;
|
this.animator = animator;
|
||||||
|
|
||||||
|
previousAnimations.Clear();
|
||||||
|
|
||||||
animationTable.Clear();
|
animationTable.Clear();
|
||||||
clipNameHashCodeTable.Clear();
|
|
||||||
var data = skeletonDataAsset.GetSkeletonData(true);
|
var data = skeletonDataAsset.GetSkeletonData(true);
|
||||||
foreach (var a in data.Animations)
|
foreach (var a in data.Animations)
|
||||||
animationTable.Add(a.Name.GetHashCode(), a);
|
animationTable.Add(a.Name.GetHashCode(), a);
|
||||||
|
|
||||||
|
clipNameHashCodeTable.Clear();
|
||||||
|
#if UNITY_CLIPINFOCACHE
|
||||||
|
clipInfoCache.Clear();
|
||||||
|
nextClipInfoCache.Clear();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Apply (Skeleton skeleton) {
|
public void Apply (Skeleton skeleton) {
|
||||||
@ -255,7 +265,7 @@ namespace Spine.Unity {
|
|||||||
out int nextClipInfoCount,
|
out int nextClipInfoCount,
|
||||||
out IList<AnimatorClipInfo> clipInfo,
|
out IList<AnimatorClipInfo> clipInfo,
|
||||||
out IList<AnimatorClipInfo> nextClipInfo) {
|
out IList<AnimatorClipInfo> nextClipInfo) {
|
||||||
#if UNITY_2017_1_OR_NEWER
|
#if UNITY_CLIPINFOCACHE
|
||||||
clipInfoCount = animator.GetCurrentAnimatorClipInfoCount(layer);
|
clipInfoCount = animator.GetCurrentAnimatorClipInfoCount(layer);
|
||||||
nextClipInfoCount = animator.GetNextAnimatorClipInfoCount(layer);
|
nextClipInfoCount = animator.GetNextAnimatorClipInfoCount(layer);
|
||||||
if (clipInfoCache.Capacity < clipInfoCount) clipInfoCache.Capacity = clipInfoCount;
|
if (clipInfoCache.Capacity < clipInfoCount) clipInfoCache.Capacity = clipInfoCount;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user