瀏覽代碼

[unity] Basic multi-editing for AtlasAsset, SkeletonDataAsset and BoneFollower.

pharan 8 年之前
父節點
當前提交
fe25ffda1a

+ 6 - 2
spine-unity/Assets/spine-unity/Asset Types/Editor/AtlasAssetInspector.cs

@@ -41,7 +41,7 @@ using Spine;
 namespace Spine.Unity.Editor {
 	using Event = UnityEngine.Event;
 
-	[CustomEditor(typeof(AtlasAsset))]
+	[CustomEditor(typeof(AtlasAsset)), CanEditMultipleObjects]
 	public class AtlasAssetInspector : UnityEditor.Editor {
 		SerializedProperty atlasFile, materials;
 		AtlasAsset atlasAsset;
@@ -103,6 +103,11 @@ namespace Spine.Unity.Editor {
 		#endif
 
 		override public void OnInspectorGUI () {
+			if (serializedObject.isEditingMultipleObjects) {
+				DrawDefaultInspector();
+				return;
+			}
+
 			serializedObject.Update();
 			atlasAsset = atlasAsset ?? (AtlasAsset)target;
 			EditorGUI.BeginChangeCheck();
@@ -113,7 +118,6 @@ namespace Spine.Unity.Editor {
 				atlasAsset.Clear();
 				atlasAsset.GetAtlas();
 			}
-				
 
 			if (materials.arraySize == 0) {
 				EditorGUILayout.LabelField(new GUIContent("Error:  Missing materials", SpineEditorUtilities.Icons.warning));

+ 34 - 3
spine-unity/Assets/spine-unity/Asset Types/Editor/SkeletonDataAssetInspector.cs

@@ -43,7 +43,7 @@ namespace Spine.Unity.Editor {
 	using Event = UnityEngine.Event;
 	using Icons = SpineEditorUtilities.Icons;
 
-	[CustomEditor(typeof(SkeletonDataAsset))]
+	[CustomEditor(typeof(SkeletonDataAsset)), CanEditMultipleObjects]
 	public class SkeletonDataAssetInspector : UnityEditor.Editor {
 		static bool showAnimationStateData = true;
 		static bool showAnimationList = true;
@@ -141,6 +141,34 @@ namespace Spine.Unity.Editor {
 		}
 
 		override public void OnInspectorGUI () {
+			if (serializedObject.isEditingMultipleObjects) {
+				using (new SpineInspectorUtility.BoxScope()) {
+					EditorGUILayout.LabelField("SkeletonData", EditorStyles.boldLabel);
+					EditorGUILayout.PropertyField(skeletonJSON, new GUIContent(skeletonJSON.displayName, Icons.spine));
+					EditorGUILayout.PropertyField(scale);
+				}
+
+				using (new SpineInspectorUtility.BoxScope()) {
+					EditorGUILayout.LabelField("Atlas", EditorStyles.boldLabel);
+					#if !SPINE_TK2D
+					EditorGUILayout.PropertyField(atlasAssets, true);
+					#else
+					using (new EditorGUI.DisabledGroupScope(spriteCollection.objectReferenceValue != null)) {
+						EditorGUILayout.PropertyField(atlasAssets, true);
+					}
+					EditorGUILayout.LabelField("spine-tk2d", EditorStyles.boldLabel);
+					EditorGUILayout.PropertyField(spriteCollection, true);
+					#endif
+				}
+
+				using (new SpineInspectorUtility.BoxScope()) {
+					EditorGUILayout.LabelField("Mix Settings", EditorStyles.boldLabel);
+					SpineInspectorUtility.PropertyFieldWideLabel(defaultMix, DefaultMixLabel, 160);
+					EditorGUILayout.Space();
+				}
+				return;
+			}
+
 			{ 
 				// Lazy initialization because accessing EditorStyles values in OnEnable during a recompile causes UnityEditor to throw null exceptions. (Unity 5.3.5)
 				idlePlayButtonStyle = idlePlayButtonStyle ?? new GUIStyle(EditorStyles.miniButton);
@@ -645,8 +673,11 @@ namespace Spine.Unity.Editor {
 			m_initialized = false;
 		}
 
-		public override bool HasPreviewGUI () {
-			// MITCH: left todo: validate json data
+		public override bool HasPreviewGUI () {			
+			if (serializedObject.isEditingMultipleObjects) {
+				// JOHN: Implement multi-preview.
+				return false;
+			}
 
 			for (int i = 0; i < atlasAssets.arraySize; i++) {
 				var prop = atlasAssets.GetArrayElementAtIndex(i);

+ 48 - 31
spine-unity/Assets/spine-unity/Editor/BoneFollowerInspector.cs

@@ -32,12 +32,37 @@ using UnityEditor;
 using UnityEngine;
 
 namespace Spine.Unity.Editor {	
-	[CustomEditor(typeof(BoneFollower))]
+	[CustomEditor(typeof(BoneFollower)), CanEditMultipleObjects]
 	public class BoneFollowerInspector : UnityEditor.Editor {
 		SerializedProperty boneName, skeletonRenderer, followZPosition, followBoneRotation, followLocalScale, followSkeletonFlip;
 		BoneFollower targetBoneFollower;
 		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 () {
 			skeletonRenderer = serializedObject.FindProperty("skeletonRenderer");
 			boneName = serializedObject.FindProperty("boneName");
@@ -52,51 +77,43 @@ namespace Spine.Unity.Editor {
 		}
 
 		public void OnSceneGUI () {
-			if (targetBoneFollower == null) return;
-			var skeletonRendererComponent = targetBoneFollower.skeletonRenderer;
+			var tbf = target as BoneFollower;
+			var skeletonRendererComponent = tbf.skeletonRenderer;
 			if (skeletonRendererComponent == null) return;
 
 			var transform = skeletonRendererComponent.transform;
 			var skeleton = skeletonRendererComponent.skeleton;
 
-			if (string.IsNullOrEmpty(targetBoneFollower.boneName)) {
+			if (string.IsNullOrEmpty(tbf.boneName)) {
 				SpineHandles.DrawBones(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 {
-				var targetBone = targetBoneFollower.bone;
+				var targetBone = tbf.bone;
 				if (targetBone == null) return;
 				SpineHandles.DrawBoneWireframe(transform, targetBone, SpineHandles.TransformContraintColor);
 				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) {
 				targetBoneFollower.Initialize();
 				targetBoneFollower.LateUpdate();
@@ -144,7 +161,7 @@ namespace Spine.Unity.Editor {
 
 					if (boneFollowerSkeletonRenderer.skeletonDataAsset == null)
 						EditorGUILayout.HelpBox("Assigned SkeletonRenderer does not have SkeletonData assigned to it.", MessageType.Warning);
-					
+
 					if (!boneFollowerSkeletonRenderer.valid)
 						EditorGUILayout.HelpBox("Assigned SkeletonRenderer is invalid. Check target SkeletonRenderer, its SkeletonDataAsset or the console for other errors.", MessageType.Warning);
 				}