Cleaned up BoneFollower

This commit is contained in:
pharan 2016-03-07 10:12:12 +08:00
parent 4f6fd8aa48
commit f4d9a66d56
2 changed files with 39 additions and 45 deletions

View File

@ -40,14 +40,8 @@ using Spine;
[AddComponentMenu("Spine/BoneFollower")] [AddComponentMenu("Spine/BoneFollower")]
public class BoneFollower : MonoBehaviour { public class BoneFollower : MonoBehaviour {
[System.NonSerialized] #region Inspector
public bool
valid;
public SkeletonRenderer skeletonRenderer; public SkeletonRenderer skeletonRenderer;
public Bone bone;
public bool followZPosition = true;
public bool followBoneRotation = true;
public SkeletonRenderer SkeletonRenderer { public SkeletonRenderer SkeletonRenderer {
get { return skeletonRenderer; } get { return skeletonRenderer; }
set { set {
@ -55,15 +49,21 @@ public class BoneFollower : MonoBehaviour {
Reset(); Reset();
} }
} }
/// <summary>If a bone isn't set, boneName is used to find the bone.</summary> /// <summary>If a bone isn't set, boneName is used to find the bone.</summary>
[SpineBone(dataField: "skeletonRenderer")] [SpineBone(dataField: "skeletonRenderer")]
public String boneName; public String boneName;
public bool followZPosition = true;
public bool followBoneRotation = true;
public bool resetOnAwake = true; public bool resetOnAwake = true;
protected Transform cachedTransform; #endregion
protected Transform skeletonTransform;
[NonSerialized]
public bool valid;
[NonSerialized]
public Bone bone;
Transform skeletonTransform;
public void HandleResetRenderer (SkeletonRenderer skeletonRenderer) { public void HandleResetRenderer (SkeletonRenderer skeletonRenderer) {
Reset(); Reset();
@ -71,21 +71,21 @@ public class BoneFollower : MonoBehaviour {
public void Reset () { public void Reset () {
bone = null; bone = null;
cachedTransform = transform;
valid = skeletonRenderer != null && skeletonRenderer.valid; valid = skeletonRenderer != null && skeletonRenderer.valid;
if (!valid)
return;
skeletonTransform = skeletonRenderer.transform;
if (!valid) return;
skeletonTransform = skeletonRenderer.transform;
skeletonRenderer.OnRebuild -= HandleResetRenderer; skeletonRenderer.OnRebuild -= HandleResetRenderer;
skeletonRenderer.OnRebuild += HandleResetRenderer; skeletonRenderer.OnRebuild += HandleResetRenderer;
#if UNITY_EDITOR
if (Application.isEditor) if (Application.isEditor)
DoUpdate(); DoUpdate();
#endif
} }
void OnDestroy () { void OnDestroy () {
//cleanup
if (skeletonRenderer != null) if (skeletonRenderer != null)
skeletonRenderer.OnRebuild -= HandleResetRenderer; skeletonRenderer.OnRebuild -= HandleResetRenderer;
} }
@ -112,33 +112,33 @@ public class BoneFollower : MonoBehaviour {
if (bone == null) { if (bone == null) {
Debug.LogError("Bone not found: " + boneName, this); Debug.LogError("Bone not found: " + boneName, this);
return; return;
} else {
} }
} }
Spine.Skeleton skeleton = skeletonRenderer.skeleton; Skeleton skeleton = skeletonRenderer.skeleton;
float flipRotation = (skeleton.flipX ^ skeleton.flipY) ? -1f : 1f; float flipRotation = (skeleton.flipX ^ skeleton.flipY) ? -1f : 1f;
Transform thisTransform = this.transform;
if (cachedTransform.parent == skeletonTransform) { // Recommended setup: Use local transform properties if Spine GameObject is parent
cachedTransform.localPosition = new Vector3(bone.worldX, bone.worldY, followZPosition ? 0f : cachedTransform.localPosition.z); if (thisTransform.parent == skeletonTransform) {
thisTransform.localPosition = new Vector3(bone.worldX, bone.worldY, followZPosition ? 0f : thisTransform.localPosition.z);
if (followBoneRotation) { if (followBoneRotation) {
Vector3 rotation = cachedTransform.localRotation.eulerAngles; Vector3 rotation = thisTransform.localRotation.eulerAngles;
cachedTransform.localRotation = Quaternion.Euler(rotation.x, rotation.y, bone.WorldRotationX * flipRotation); thisTransform.localRotation = Quaternion.Euler(rotation.x, rotation.y, bone.WorldRotationX * flipRotation);
} }
// For special cases: Use transform world properties if transform relationship is complicated
} else { } else {
Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f)); Vector3 targetWorldPosition = skeletonTransform.TransformPoint(new Vector3(bone.worldX, bone.worldY, 0f));
if (!followZPosition) if (!followZPosition)
targetWorldPosition.z = cachedTransform.position.z; targetWorldPosition.z = thisTransform.position.z;
cachedTransform.position = targetWorldPosition; thisTransform.position = targetWorldPosition;
if (followBoneRotation) { if (followBoneRotation) {
Vector3 rotation = skeletonTransform.rotation.eulerAngles; Vector3 worldRotation = skeletonTransform.rotation.eulerAngles;
thisTransform.rotation = Quaternion.Euler(worldRotation.x, worldRotation.y, skeletonTransform.rotation.eulerAngles.z + (bone.WorldRotationX * flipRotation));
cachedTransform.rotation = Quaternion.Euler(rotation.x, rotation.y, skeletonTransform.rotation.eulerAngles.z + (bone.WorldRotationX * flipRotation));
} }
} }

View File

@ -35,7 +35,7 @@ using UnityEngine;
[CustomEditor(typeof(BoneFollower))] [CustomEditor(typeof(BoneFollower))]
public class BoneFollowerInspector : Editor { public class BoneFollowerInspector : Editor {
private SerializedProperty boneName, skeletonRenderer, followZPosition, followBoneRotation; SerializedProperty boneName, skeletonRenderer, followZPosition, followBoneRotation;
BoneFollower component; BoneFollower component;
bool needsReset; bool needsReset;
@ -48,17 +48,6 @@ public class BoneFollowerInspector : Editor {
component.skeletonRenderer.Initialize(false); component.skeletonRenderer.Initialize(false);
} }
void FindRenderer () {
if (skeletonRenderer.objectReferenceValue == null) {
SkeletonRenderer parentRenderer = SkeletonUtility.GetInParent<SkeletonRenderer>(component.transform);
if (parentRenderer != null) {
skeletonRenderer.objectReferenceValue = (UnityEngine.Object)parentRenderer;
}
}
}
override public void OnInspectorGUI () { override public void OnInspectorGUI () {
if (needsReset) { if (needsReset) {
component.Reset(); component.Reset();
@ -68,7 +57,14 @@ public class BoneFollowerInspector : Editor {
} }
serializedObject.Update(); serializedObject.Update();
FindRenderer(); // FindRenderer()
if (skeletonRenderer.objectReferenceValue == null) {
SkeletonRenderer parentRenderer = SkeletonUtility.GetInParent<SkeletonRenderer>(component.transform);
if (parentRenderer != null) {
skeletonRenderer.objectReferenceValue = (UnityEngine.Object)parentRenderer;
}
}
EditorGUILayout.PropertyField(skeletonRenderer); EditorGUILayout.PropertyField(skeletonRenderer);
@ -81,8 +77,6 @@ public class BoneFollowerInspector : Editor {
serializedObject.Update(); serializedObject.Update();
} }
EditorGUILayout.PropertyField(followBoneRotation); EditorGUILayout.PropertyField(followBoneRotation);
EditorGUILayout.PropertyField(followZPosition); EditorGUILayout.PropertyField(followZPosition);
} else { } else {