From ddce81c5226bb23f514df51f0992edb41b4a8a88 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 11 May 2017 04:03:13 +0800 Subject: [PATCH] [unity] Handle BoneFollower parent negative matrix scale. --- spine-unity/Assets/spine-unity/BoneFollower.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/spine-unity/Assets/spine-unity/BoneFollower.cs b/spine-unity/Assets/spine-unity/BoneFollower.cs index e312ee5b3..ed3b60441 100644 --- a/spine-unity/Assets/spine-unity/BoneFollower.cs +++ b/spine-unity/Assets/spine-unity/BoneFollower.cs @@ -134,10 +134,19 @@ namespace Spine.Unity { Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f)); if (!followZPosition) targetWorldPosition.z = thisTransform.position.z; + float boneWorldRotation = bone.WorldRotationX; + + Transform transformParent = thisTransform.parent; + if (transformParent != null) { + Matrix4x4 m = transformParent.localToWorldMatrix; + if (m.m00 * m.m11 - m.m01 * m.m10 < 0) // Determinant2D is negative + boneWorldRotation = -boneWorldRotation; + } + if (followBoneRotation) { Vector3 worldRotation = skeletonTransform.rotation.eulerAngles; #if UNITY_5_6_OR_NEWER - thisTransform.SetPositionAndRotation(targetWorldPosition, Quaternion.Euler(worldRotation.x, worldRotation.y, skeletonTransform.rotation.eulerAngles.z + bone.WorldRotationX)); + thisTransform.SetPositionAndRotation(targetWorldPosition, Quaternion.Euler(worldRotation.x, worldRotation.y, skeletonTransform.rotation.eulerAngles.z + boneWorldRotation)); #else thisTransform.position = targetWorldPosition; thisTransform.rotation = Quaternion.Euler(worldRotation.x, worldRotation.y, skeletonTransform.rotation.eulerAngles.z + bone.WorldRotationX);