Merge remote-tracking branch 'origin/master'

This commit is contained in:
NathanSweet 2016-06-17 12:24:42 +02:00
commit 8239b2f905
2 changed files with 34 additions and 51 deletions

View File

@ -43,68 +43,61 @@ namespace Spine.Unity {
get { return skeletonRenderer; } get { return skeletonRenderer; }
set { set {
skeletonRenderer = value; skeletonRenderer = value;
Reset(); Initialize();
} }
} }
/// <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 followZPosition = true;
public bool followBoneRotation = true; public bool followBoneRotation = true;
public bool resetOnAwake = true; [UnityEngine.Serialization.FormerlySerializedAs("resetOnAwake")]
public bool initializeOnAwake = true;
#endregion #endregion
[NonSerialized] [NonSerialized] public bool valid;
public bool valid; [NonSerialized] public Bone bone;
[NonSerialized]
public Bone bone;
Transform skeletonTransform; Transform skeletonTransform;
public void HandleResetRenderer (SkeletonRenderer skeletonRenderer) { public void Awake () {
Reset(); if (initializeOnAwake) Initialize();
} }
public void Reset () { public void HandleRebuildRenderer (SkeletonRenderer skeletonRenderer) {
Initialize();
}
public void Initialize () {
bone = null; bone = null;
valid = skeletonRenderer != null && skeletonRenderer.valid; valid = skeletonRenderer != null && skeletonRenderer.valid;
if (!valid) return; if (!valid) return;
skeletonTransform = skeletonRenderer.transform; skeletonTransform = skeletonRenderer.transform;
skeletonRenderer.OnRebuild -= HandleResetRenderer; skeletonRenderer.OnRebuild -= HandleRebuildRenderer;
skeletonRenderer.OnRebuild += HandleResetRenderer; skeletonRenderer.OnRebuild += HandleRebuildRenderer;
#if UNITY_EDITOR #if UNITY_EDITOR
if (Application.isEditor) if (Application.isEditor)
DoUpdate(); LateUpdate();
#endif #endif
} }
void OnDestroy () { void OnDestroy () {
if (skeletonRenderer != null) if (skeletonRenderer != null)
skeletonRenderer.OnRebuild -= HandleResetRenderer; skeletonRenderer.OnRebuild -= HandleRebuildRenderer;
} }
public void Awake () { public void LateUpdate () {
if (resetOnAwake)
Reset();
}
void LateUpdate () {
DoUpdate();
}
public void DoUpdate () {
if (!valid) { if (!valid) {
Reset(); Initialize();
return; return;
} }
if (bone == null) { if (bone == null) {
if (boneName == null || boneName.Length == 0) if (string.IsNullOrEmpty(boneName)) return;
return;
bone = skeletonRenderer.skeleton.FindBone(boneName); bone = skeletonRenderer.skeleton.FindBone(boneName);
if (bone == null) { if (bone == null) {
Debug.LogError("Bone not found: " + boneName, this); Debug.LogError("Bone not found: " + boneName, this);
@ -112,33 +105,23 @@ namespace Spine.Unity {
} }
} }
Skeleton skeleton = skeletonRenderer.skeleton;
float flipRotation = (skeleton.flipX ^ skeleton.flipY) ? -1f : 1f;
Transform thisTransform = this.transform; Transform thisTransform = this.transform;
// Recommended setup: Use local transform properties if Spine GameObject is parent
if (thisTransform.parent == skeletonTransform) { 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); thisTransform.localPosition = new Vector3(bone.worldX, bone.worldY, followZPosition ? 0f : thisTransform.localPosition.z);
if (followBoneRotation) thisTransform.localRotation = Quaternion.Euler(0f, 0f, bone.WorldRotationX);
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
} else { } else {
// For special cases: Use transform world properties if transform relationship is complicated
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 = thisTransform.position.z;
targetWorldPosition.z = thisTransform.position.z;
thisTransform.position = targetWorldPosition; thisTransform.position = targetWorldPosition;
if (followBoneRotation) { if (followBoneRotation) {
Vector3 worldRotation = skeletonTransform.rotation.eulerAngles; 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 + bone.WorldRotationX);
} }
} }
} }
} }

View File

@ -52,8 +52,8 @@ namespace Spine.Unity.Editor {
override public void OnInspectorGUI () { override public void OnInspectorGUI () {
if (needsReset) { if (needsReset) {
component.Reset(); component.Initialize();
component.DoUpdate(); component.LateUpdate();
needsReset = false; needsReset = false;
SceneView.RepaintAll(); SceneView.RepaintAll();
} }
@ -89,17 +89,17 @@ namespace Spine.Unity.Editor {
if (serializedObject.ApplyModifiedProperties() || if (serializedObject.ApplyModifiedProperties() ||
(UnityEngine.Event.current.type == EventType.ValidateCommand && UnityEngine.Event.current.commandName == "UndoRedoPerformed") (UnityEngine.Event.current.type == EventType.ValidateCommand && UnityEngine.Event.current.commandName == "UndoRedoPerformed")
) { ) {
component.Reset(); component.Initialize();
} }
} }
public static T GetInParent<T> (Transform origin) where T : Component { public static T GetInParent<T> (Transform origin) where T : Component {
#if UNITY_4_3 #if UNITY_4_3
Transform parent = origin.parent; Transform parent = origin.parent;
while(parent.GetComponent<T>() == null){ while (parent.GetComponent<T>() == null) {
parent = parent.parent; parent = parent.parent;
if(parent == null) if(parent == null)
return default(T); return default(T);
} }
return parent.GetComponent<T>(); return parent.GetComponent<T>();