From 16011c2eb1dc530e4703004bfab930308287ef91 Mon Sep 17 00:00:00 2001 From: pharan Date: Thu, 16 Jun 2016 15:44:46 +0800 Subject: [PATCH 1/2] [Unity] Update BoneFollower --- .../Assets/spine-unity/BoneFollower.cs | 73 +++++++++---------- .../Editor/BoneFollowerInspector.cs | 14 ++-- 2 files changed, 42 insertions(+), 45 deletions(-) diff --git a/spine-unity/Assets/spine-unity/BoneFollower.cs b/spine-unity/Assets/spine-unity/BoneFollower.cs index e43622c3f..cb2defad0 100644 --- a/spine-unity/Assets/spine-unity/BoneFollower.cs +++ b/spine-unity/Assets/spine-unity/BoneFollower.cs @@ -43,68 +43,64 @@ namespace Spine.Unity { get { return skeletonRenderer; } set { skeletonRenderer = value; - Reset(); + Initialize(); } } + /// If a bone isn't set, boneName is used to find the bone. [SpineBone(dataField: "skeletonRenderer")] public String boneName; public bool followZPosition = true; public bool followBoneRotation = true; - public bool resetOnAwake = true; + [UnityEngine.Serialization.FormerlySerializedAs("resetOnAwake")] + public bool initializeOnAwake = true; #endregion - [NonSerialized] - public bool valid; - - [NonSerialized] - public Bone bone; + [NonSerialized] public bool valid; + [NonSerialized] public Bone bone; Transform skeletonTransform; - public void HandleResetRenderer (SkeletonRenderer skeletonRenderer) { - Reset(); + public void Awake () { + if (initializeOnAwake) + Initialize(); } - public void Reset () { + public void HandleRebuildRenderer (SkeletonRenderer skeletonRenderer) { + Initialize(); + } + + public void Initialize () { bone = null; valid = skeletonRenderer != null && skeletonRenderer.valid; if (!valid) return; skeletonTransform = skeletonRenderer.transform; - skeletonRenderer.OnRebuild -= HandleResetRenderer; - skeletonRenderer.OnRebuild += HandleResetRenderer; + skeletonRenderer.OnRebuild -= HandleRebuildRenderer; + skeletonRenderer.OnRebuild += HandleRebuildRenderer; #if UNITY_EDITOR if (Application.isEditor) - DoUpdate(); + LateUpdate(); #endif } void OnDestroy () { if (skeletonRenderer != null) - skeletonRenderer.OnRebuild -= HandleResetRenderer; + skeletonRenderer.OnRebuild -= HandleRebuildRenderer; } - public void Awake () { - if (resetOnAwake) - Reset(); - } - - void LateUpdate () { - DoUpdate(); - } - - public void DoUpdate () { + public void LateUpdate () { if (!valid) { - Reset(); + Initialize(); return; } if (bone == null) { - if (boneName == null || boneName.Length == 0) + if (string.IsNullOrEmpty(boneName)) return; + bone = skeletonRenderer.skeleton.FindBone(boneName); if (bone == null) { Debug.LogError("Bone not found: " + boneName, this); @@ -112,33 +108,34 @@ namespace Spine.Unity { } } - Skeleton skeleton = skeletonRenderer.skeleton; - float flipRotation = (skeleton.flipX ^ skeleton.flipY) ? -1f : 1f; - Transform thisTransform = this.transform; + // Flip rotation + float boneRotation = bone.WorldRotationX; + { + Skeleton skeleton = skeletonRenderer.skeleton; + bool flipX = skeleton.flipX; + if (flipX ^ skeleton.flipY) boneRotation *= -1f; + if (flipX) boneRotation += 180f; + } + Transform thisTransform = this.transform; // Recommended setup: Use local transform properties if Spine GameObject is parent if (thisTransform.parent == skeletonTransform) { thisTransform.localPosition = new Vector3(bone.worldX, bone.worldY, followZPosition ? 0f : thisTransform.localPosition.z); + if (followBoneRotation) + thisTransform.localRotation = Quaternion.Euler(0f, 0f, boneRotation); - if (followBoneRotation) { - Vector3 rotation = thisTransform.localRotation.eulerAngles; - thisTransform.localRotation = Quaternion.Euler(rotation.x, rotation.y, bone.WorldRotationX * flipRotation); - } - - // For special cases: Use transform world properties if transform relationship is complicated + // For special cases: Use transform world properties if transform relationship is complicated } else { Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f)); if (!followZPosition) targetWorldPosition.z = thisTransform.position.z; thisTransform.position = targetWorldPosition; - if (followBoneRotation) { Vector3 worldRotation = skeletonTransform.rotation.eulerAngles; - thisTransform.rotation = Quaternion.Euler(worldRotation.x, worldRotation.y, skeletonTransform.rotation.eulerAngles.z + (bone.WorldRotationX * flipRotation)); + thisTransform.rotation = Quaternion.Euler(worldRotation.x, worldRotation.y, skeletonTransform.rotation.eulerAngles.z + boneRotation); } } - } } diff --git a/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs b/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs index f81af9955..44221347e 100644 --- a/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs +++ b/spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs @@ -52,8 +52,8 @@ namespace Spine.Unity.Editor { override public void OnInspectorGUI () { if (needsReset) { - component.Reset(); - component.DoUpdate(); + component.Initialize(); + component.LateUpdate(); needsReset = false; SceneView.RepaintAll(); } @@ -89,17 +89,17 @@ namespace Spine.Unity.Editor { if (serializedObject.ApplyModifiedProperties() || (UnityEngine.Event.current.type == EventType.ValidateCommand && UnityEngine.Event.current.commandName == "UndoRedoPerformed") ) { - component.Reset(); + component.Initialize(); } } public static T GetInParent (Transform origin) where T : Component { #if UNITY_4_3 Transform parent = origin.parent; - while(parent.GetComponent() == null){ - parent = parent.parent; - if(parent == null) - return default(T); + while (parent.GetComponent() == null) { + parent = parent.parent; + if(parent == null) + return default(T); } return parent.GetComponent(); From 21b8a03ccda97a0574620ae62c9e700a9d65cb62 Mon Sep 17 00:00:00 2001 From: John Date: Fri, 17 Jun 2016 18:17:57 +0800 Subject: [PATCH 2/2] [Unity] Update BoneFollower --- .../Assets/spine-unity/BoneFollower.cs | 32 ++++++------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/spine-unity/Assets/spine-unity/BoneFollower.cs b/spine-unity/Assets/spine-unity/BoneFollower.cs index cb2defad0..a5a1af424 100644 --- a/spine-unity/Assets/spine-unity/BoneFollower.cs +++ b/spine-unity/Assets/spine-unity/BoneFollower.cs @@ -62,8 +62,7 @@ namespace Spine.Unity { Transform skeletonTransform; public void Awake () { - if (initializeOnAwake) - Initialize(); + if (initializeOnAwake) Initialize(); } public void HandleRebuildRenderer (SkeletonRenderer skeletonRenderer) { @@ -73,7 +72,6 @@ namespace Spine.Unity { public void Initialize () { bone = null; valid = skeletonRenderer != null && skeletonRenderer.valid; - if (!valid) return; skeletonTransform = skeletonRenderer.transform; @@ -98,8 +96,7 @@ namespace Spine.Unity { } if (bone == null) { - if (string.IsNullOrEmpty(boneName)) - return; + if (string.IsNullOrEmpty(boneName)) return; bone = skeletonRenderer.skeleton.FindBone(boneName); if (bone == null) { @@ -108,32 +105,21 @@ namespace Spine.Unity { } } - // Flip rotation - float boneRotation = bone.WorldRotationX; - { - Skeleton skeleton = skeletonRenderer.skeleton; - bool flipX = skeleton.flipX; - if (flipX ^ skeleton.flipY) boneRotation *= -1f; - if (flipX) boneRotation += 180f; - } - Transform thisTransform = this.transform; - // Recommended setup: Use local transform properties if Spine GameObject is parent if (thisTransform.parent == skeletonTransform) { + // 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, boneRotation); - - // For special cases: Use transform world properties if transform relationship is complicated + 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)); - if (!followZPosition) - targetWorldPosition.z = thisTransform.position.z; - + if (!followZPosition) targetWorldPosition.z = thisTransform.position.z; thisTransform.position = targetWorldPosition; + if (followBoneRotation) { Vector3 worldRotation = skeletonTransform.rotation.eulerAngles; - thisTransform.rotation = Quaternion.Euler(worldRotation.x, worldRotation.y, skeletonTransform.rotation.eulerAngles.z + boneRotation); + thisTransform.rotation = Quaternion.Euler(worldRotation.x, worldRotation.y, skeletonTransform.rotation.eulerAngles.z + bone.WorldRotationX); } } }