浏览代码

Merge branch '3.6' into 3.7-beta

badlogic 7 年之前
父节点
当前提交
cbc8231b18
共有 2 个文件被更改,包括 28 次插入8 次删除
  1. 13 3
      spine-unity/Assets/spine-unity/BoneFollower.cs
  2. 15 5
      spine-unity/Assets/spine-unity/SkeletonAnimator.cs

+ 13 - 3
spine-unity/Assets/spine-unity/BoneFollower.cs

@@ -137,7 +137,16 @@ namespace Spine.Unity {
 			if (skeletonTransformIsParent) {
 				// 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);
-				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 {
 				// For special cases: Use transform world properties if transform relationship is complicated
 				Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f));
@@ -154,11 +163,12 @@ namespace Spine.Unity {
 
 				if (followBoneRotation) {
 					Vector3 worldRotation = skeletonTransform.rotation.eulerAngles;
+					if (followLocalScale && bone.scaleX < 0) boneWorldRotation += 180f;
 					#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
 					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
 				} else {
 					thisTransform.position = targetWorldPosition;

+ 15 - 5
spine-unity/Assets/spine-unity/SkeletonAnimator.cs

@@ -28,7 +28,9 @@
  * POSSIBILITY OF SUCH DAMAGE.
  *****************************************************************************/
 
-// Contributed by: Mitch Thompson
+#if UNITY_5_6_OR_NEWER
+#define UNITY_CLIPINFOCACHE
+#endif
 
 using UnityEngine;
 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<AnimationClip, int> clipNameHashCodeTable = new Dictionary<AnimationClip, int>(AnimationClipEqualityComparer.Instance);
 			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> nextClipInfoCache = new List<AnimatorClipInfo>();
 			#endif
-			Animator animator;
 
+			Animator animator;
 			public Animator Animator { get { return this.animator; } }
 
 			public void Initialize (Animator animator, SkeletonDataAsset skeletonDataAsset) {
 				this.animator = animator;
+
+				previousAnimations.Clear();
+
 				animationTable.Clear();
-				clipNameHashCodeTable.Clear();
 				var data = skeletonDataAsset.GetSkeletonData(true);
 				foreach (var a in data.Animations)
 					animationTable.Add(a.Name.GetHashCode(), a);
+
+				clipNameHashCodeTable.Clear();
+				#if UNITY_CLIPINFOCACHE
+				clipInfoCache.Clear();
+				nextClipInfoCache.Clear();
+				#endif
 			}
 
 			public void Apply (Skeleton skeleton) {
@@ -255,7 +265,7 @@ namespace Spine.Unity {
 				out int nextClipInfoCount,
 				out IList<AnimatorClipInfo> clipInfo,
 				out IList<AnimatorClipInfo> nextClipInfo) {
-				#if UNITY_2017_1_OR_NEWER
+				#if UNITY_CLIPINFOCACHE
 				clipInfoCount = animator.GetCurrentAnimatorClipInfoCount(layer);
 				nextClipInfoCount = animator.GetNextAnimatorClipInfoCount(layer);
 				if (clipInfoCache.Capacity < clipInfoCount) clipInfoCache.Capacity = clipInfoCount;