|
@@ -32,12 +32,37 @@ using UnityEditor;
|
|
using UnityEngine;
|
|
using UnityEngine;
|
|
|
|
|
|
namespace Spine.Unity.Editor {
|
|
namespace Spine.Unity.Editor {
|
|
- [CustomEditor(typeof(BoneFollower))]
|
|
|
|
|
|
+ [CustomEditor(typeof(BoneFollower)), CanEditMultipleObjects]
|
|
public class BoneFollowerInspector : UnityEditor.Editor {
|
|
public class BoneFollowerInspector : UnityEditor.Editor {
|
|
SerializedProperty boneName, skeletonRenderer, followZPosition, followBoneRotation, followLocalScale, followSkeletonFlip;
|
|
SerializedProperty boneName, skeletonRenderer, followZPosition, followBoneRotation, followLocalScale, followSkeletonFlip;
|
|
BoneFollower targetBoneFollower;
|
|
BoneFollower targetBoneFollower;
|
|
bool needsReset;
|
|
bool needsReset;
|
|
|
|
|
|
|
|
+ #region Context Menu Item
|
|
|
|
+ [MenuItem ("CONTEXT/SkeletonRenderer/Add BoneFollower GameObject")]
|
|
|
|
+ static void AddBoneFollowerGameObject (MenuCommand cmd) {
|
|
|
|
+ var skeletonRenderer = cmd.context as SkeletonRenderer;
|
|
|
|
+ var go = new GameObject("BoneFollower");
|
|
|
|
+ var t = go.transform;
|
|
|
|
+ t.SetParent(skeletonRenderer.transform);
|
|
|
|
+ t.localPosition = Vector3.zero;
|
|
|
|
+
|
|
|
|
+ var f = go.AddComponent<BoneFollower>();
|
|
|
|
+ f.skeletonRenderer = skeletonRenderer;
|
|
|
|
+
|
|
|
|
+ EditorGUIUtility.PingObject(t);
|
|
|
|
+
|
|
|
|
+ Undo.RegisterCreatedObjectUndo(go, "Add BoneFollower");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Validate
|
|
|
|
+ [MenuItem ("CONTEXT/SkeletonRenderer/Add BoneFollower GameObject", true)]
|
|
|
|
+ static bool ValidateAddBoneFollowerGameObject (MenuCommand cmd) {
|
|
|
|
+ var skeletonRenderer = cmd.context as SkeletonRenderer;
|
|
|
|
+ return skeletonRenderer.valid;
|
|
|
|
+ }
|
|
|
|
+ #endregion
|
|
|
|
+
|
|
void OnEnable () {
|
|
void OnEnable () {
|
|
skeletonRenderer = serializedObject.FindProperty("skeletonRenderer");
|
|
skeletonRenderer = serializedObject.FindProperty("skeletonRenderer");
|
|
boneName = serializedObject.FindProperty("boneName");
|
|
boneName = serializedObject.FindProperty("boneName");
|
|
@@ -52,51 +77,43 @@ namespace Spine.Unity.Editor {
|
|
}
|
|
}
|
|
|
|
|
|
public void OnSceneGUI () {
|
|
public void OnSceneGUI () {
|
|
- if (targetBoneFollower == null) return;
|
|
|
|
- var skeletonRendererComponent = targetBoneFollower.skeletonRenderer;
|
|
|
|
|
|
+ var tbf = target as BoneFollower;
|
|
|
|
+ var skeletonRendererComponent = tbf.skeletonRenderer;
|
|
if (skeletonRendererComponent == null) return;
|
|
if (skeletonRendererComponent == null) return;
|
|
|
|
|
|
var transform = skeletonRendererComponent.transform;
|
|
var transform = skeletonRendererComponent.transform;
|
|
var skeleton = skeletonRendererComponent.skeleton;
|
|
var skeleton = skeletonRendererComponent.skeleton;
|
|
|
|
|
|
- if (string.IsNullOrEmpty(targetBoneFollower.boneName)) {
|
|
|
|
|
|
+ if (string.IsNullOrEmpty(tbf.boneName)) {
|
|
SpineHandles.DrawBones(transform, skeleton);
|
|
SpineHandles.DrawBones(transform, skeleton);
|
|
SpineHandles.DrawBoneNames(transform, skeleton);
|
|
SpineHandles.DrawBoneNames(transform, skeleton);
|
|
- Handles.Label(targetBoneFollower.transform.position, "No bone selected", EditorStyles.helpBox);
|
|
|
|
|
|
+ Handles.Label(tbf.transform.position, "No bone selected", EditorStyles.helpBox);
|
|
} else {
|
|
} else {
|
|
- var targetBone = targetBoneFollower.bone;
|
|
|
|
|
|
+ var targetBone = tbf.bone;
|
|
if (targetBone == null) return;
|
|
if (targetBone == null) return;
|
|
SpineHandles.DrawBoneWireframe(transform, targetBone, SpineHandles.TransformContraintColor);
|
|
SpineHandles.DrawBoneWireframe(transform, targetBone, SpineHandles.TransformContraintColor);
|
|
Handles.Label(targetBone.GetWorldPosition(transform), targetBone.Data.Name, SpineHandles.BoneNameStyle);
|
|
Handles.Label(targetBone.GetWorldPosition(transform), targetBone.Data.Name, SpineHandles.BoneNameStyle);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- #region Context Menu Item
|
|
|
|
- [MenuItem ("CONTEXT/SkeletonRenderer/Add BoneFollower GameObject")]
|
|
|
|
- static void AddBoneFollowerGameObject (MenuCommand cmd) {
|
|
|
|
- var skeletonRenderer = cmd.context as SkeletonRenderer;
|
|
|
|
- var go = new GameObject("BoneFollower");
|
|
|
|
- var t = go.transform;
|
|
|
|
- t.SetParent(skeletonRenderer.transform);
|
|
|
|
- t.localPosition = Vector3.zero;
|
|
|
|
-
|
|
|
|
- var f = go.AddComponent<BoneFollower>();
|
|
|
|
- f.skeletonRenderer = skeletonRenderer;
|
|
|
|
-
|
|
|
|
- EditorGUIUtility.PingObject(t);
|
|
|
|
-
|
|
|
|
- Undo.RegisterCreatedObjectUndo(go, "Add BoneFollower");
|
|
|
|
- }
|
|
|
|
|
|
+ override public void OnInspectorGUI () {
|
|
|
|
+ if (serializedObject.isEditingMultipleObjects) {
|
|
|
|
+ if (needsReset) {
|
|
|
|
+ needsReset = false;
|
|
|
|
+ foreach (var o in targets) {
|
|
|
|
+ var bf = (BoneFollower)o;
|
|
|
|
+ bf.Initialize();
|
|
|
|
+ bf.LateUpdate();
|
|
|
|
+ }
|
|
|
|
+ SceneView.RepaintAll();
|
|
|
|
+ }
|
|
|
|
|
|
- // Validate
|
|
|
|
- [MenuItem ("CONTEXT/SkeletonRenderer/Add BoneFollower GameObject", true)]
|
|
|
|
- static bool ValidateAddBoneFollowerGameObject (MenuCommand cmd) {
|
|
|
|
- var skeletonRenderer = cmd.context as SkeletonRenderer;
|
|
|
|
- return skeletonRenderer.valid;
|
|
|
|
- }
|
|
|
|
- #endregion
|
|
|
|
|
|
+ EditorGUI.BeginChangeCheck();
|
|
|
|
+ DrawDefaultInspector();
|
|
|
|
+ needsReset |= EditorGUI.EndChangeCheck();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
|
|
- override public void OnInspectorGUI () {
|
|
|
|
if (needsReset) {
|
|
if (needsReset) {
|
|
targetBoneFollower.Initialize();
|
|
targetBoneFollower.Initialize();
|
|
targetBoneFollower.LateUpdate();
|
|
targetBoneFollower.LateUpdate();
|
|
@@ -144,7 +161,7 @@ namespace Spine.Unity.Editor {
|
|
|
|
|
|
if (boneFollowerSkeletonRenderer.skeletonDataAsset == null)
|
|
if (boneFollowerSkeletonRenderer.skeletonDataAsset == null)
|
|
EditorGUILayout.HelpBox("Assigned SkeletonRenderer does not have SkeletonData assigned to it.", MessageType.Warning);
|
|
EditorGUILayout.HelpBox("Assigned SkeletonRenderer does not have SkeletonData assigned to it.", MessageType.Warning);
|
|
-
|
|
|
|
|
|
+
|
|
if (!boneFollowerSkeletonRenderer.valid)
|
|
if (!boneFollowerSkeletonRenderer.valid)
|
|
EditorGUILayout.HelpBox("Assigned SkeletonRenderer is invalid. Check target SkeletonRenderer, its SkeletonDataAsset or the console for other errors.", MessageType.Warning);
|
|
EditorGUILayout.HelpBox("Assigned SkeletonRenderer is invalid. Check target SkeletonRenderer, its SkeletonDataAsset or the console for other errors.", MessageType.Warning);
|
|
}
|
|
}
|