From a7a7dd9e93d29a9183df7911e93603df2ab893dd Mon Sep 17 00:00:00 2001 From: pharan Date: Wed, 7 Dec 2016 04:44:05 +0800 Subject: [PATCH] [unity] BoneFollower.followLocalScale --- spine-unity/Assets/spine-unity/BoneFollower.cs | 14 +++++++------- .../spine-unity/Editor/BoneFollowerInspector.cs | 4 +++- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/spine-unity/Assets/spine-unity/BoneFollower.cs b/spine-unity/Assets/spine-unity/BoneFollower.cs index 5c7ed0c7a..b0280009a 100644 --- a/spine-unity/Assets/spine-unity/BoneFollower.cs +++ b/spine-unity/Assets/spine-unity/BoneFollower.cs @@ -57,6 +57,9 @@ namespace Spine.Unity { [Tooltip("Follows the skeleton's flip state by controlling this Transform's local scale.")] public bool followSkeletonFlip = false; + [Tooltip("Follows the target bone's local scale. BoneFollower cannot inherit world/skewed scale because of UnityEngine.Transform property limitations.")] + public bool followLocalScale = false; + [UnityEngine.Serialization.FormerlySerializedAs("resetOnAwake")] public bool initializeOnAwake = true; #endregion @@ -101,7 +104,6 @@ namespace Spine.Unity { if (bone == null) { if (string.IsNullOrEmpty(boneName)) return; - bone = skeletonRenderer.skeleton.FindBone(boneName); if (bone == null) { Debug.LogError("Bone not found: " + boneName, this); @@ -114,7 +116,6 @@ namespace Spine.Unity { // 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 = Quaternion.Euler(0f, 0f, bone.WorldRotationX); - } else { // For special cases: Use transform world properties if transform relationship is complicated Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f)); @@ -126,11 +127,10 @@ namespace Spine.Unity { thisTransform.rotation = Quaternion.Euler(worldRotation.x, worldRotation.y, skeletonTransform.rotation.eulerAngles.z + bone.WorldRotationX); } } - - if (followSkeletonFlip) { - float flipScaleY = bone.skeleton.flipX ^ bone.skeleton.flipY ? -1f : 1f; - thisTransform.localScale = new Vector3(1f, flipScaleY, 1f); - } + + Vector3 localScale = followLocalScale ? new Vector3(bone.scaleX, bone.scaleY, 1f) : Vector3.one; + if (followSkeletonFlip) localScale.y *= bone.skeleton.flipX ^ bone.skeleton.flipY ? -1f : 1f; + thisTransform.localScale = localScale; } } diff --git a/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs b/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs index aa321e019..e0b24a344 100644 --- a/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs +++ b/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs @@ -34,7 +34,7 @@ using UnityEngine; namespace Spine.Unity.Editor { [CustomEditor(typeof(BoneFollower))] public class BoneFollowerInspector : UnityEditor.Editor { - SerializedProperty boneName, skeletonRenderer, followZPosition, followBoneRotation, followSkeletonFlip; + SerializedProperty boneName, skeletonRenderer, followZPosition, followBoneRotation, followLocalScale, followSkeletonFlip; BoneFollower targetBoneFollower; bool needsReset; @@ -43,6 +43,7 @@ namespace Spine.Unity.Editor { boneName = serializedObject.FindProperty("boneName"); followBoneRotation = serializedObject.FindProperty("followBoneRotation"); followZPosition = serializedObject.FindProperty("followZPosition"); + followLocalScale = serializedObject.FindProperty("followLocalScale"); followSkeletonFlip = serializedObject.FindProperty("followSkeletonFlip"); targetBoneFollower = (BoneFollower)target; @@ -87,6 +88,7 @@ namespace Spine.Unity.Editor { } EditorGUILayout.PropertyField(followBoneRotation); EditorGUILayout.PropertyField(followZPosition); + EditorGUILayout.PropertyField(followLocalScale); EditorGUILayout.PropertyField(followSkeletonFlip); } else { var boneFollowerSkeletonRenderer = targetBoneFollower.skeletonRenderer;