mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
Cleaned up BoneFollower
This commit is contained in:
parent
4f6fd8aa48
commit
f4d9a66d56
@ -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));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user