[unity] Some SpineEditorUtilities cleanup.

This commit is contained in:
pharan 2018-03-08 22:02:15 +08:00
parent aaeee6de13
commit a8921ac7e3

View File

@ -163,9 +163,7 @@ namespace Spine.Unity.Editor {
static readonly List<ScriptableObject> protectFromStackGarbageCollection = new List<ScriptableObject>(); static readonly List<ScriptableObject> protectFromStackGarbageCollection = new List<ScriptableObject>();
static HashSet<string> assetsImportedInWrongState = new HashSet<string>(); static HashSet<string> assetsImportedInWrongState = new HashSet<string>();
static Dictionary<int, GameObject> skeletonRendererTable = new Dictionary<int, GameObject>();
static Dictionary<int, SkeletonUtilityBone> skeletonUtilityBoneTable = new Dictionary<int, SkeletonUtilityBone>();
static Dictionary<int, BoundingBoxFollower> boundingBoxFollowerTable = new Dictionary<int, BoundingBoxFollower>();
#if SPINE_TK2D #if SPINE_TK2D
const float DEFAULT_DEFAULT_SCALE = 1f; const float DEFAULT_DEFAULT_SCALE = 1f;
@ -224,21 +222,20 @@ namespace Spine.Unity.Editor {
// Drag and Drop // Drag and Drop
SceneView.onSceneGUIDelegate -= SceneViewDragAndDrop; SceneView.onSceneGUIDelegate -= SceneViewDragAndDrop;
SceneView.onSceneGUIDelegate += SceneViewDragAndDrop; SceneView.onSceneGUIDelegate += SceneViewDragAndDrop;
EditorApplication.hierarchyWindowItemOnGUI -= HierarchyDragAndDrop; EditorApplication.hierarchyWindowItemOnGUI -= SpineEditorHierarchyHandler.HierarchyDragAndDrop;
EditorApplication.hierarchyWindowItemOnGUI += HierarchyDragAndDrop; EditorApplication.hierarchyWindowItemOnGUI += SpineEditorHierarchyHandler.HierarchyDragAndDrop;
// Hierarchy Icons // Hierarchy Icons
#if UNITY_2017_2_OR_NEWER #if UNITY_2017_2_OR_NEWER
EditorApplication.playModeStateChanged -= HierarchyIconsOnPlaymodeStateChanged; EditorApplication.playModeStateChanged -= SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged;
EditorApplication.playModeStateChanged += HierarchyIconsOnPlaymodeStateChanged; EditorApplication.playModeStateChanged += SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged;
HierarchyIconsOnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode); SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode);
#else #else
EditorApplication.playmodeStateChanged -= HierarchyIconsOnPlaymodeStateChanged; EditorApplication.playmodeStateChanged -= SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged;
EditorApplication.playmodeStateChanged += HierarchyIconsOnPlaymodeStateChanged; EditorApplication.playmodeStateChanged += SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged;
HierarchyIconsOnPlaymodeStateChanged(); SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged();
#endif #endif
initialized = true; initialized = true;
} }
@ -261,9 +258,9 @@ namespace Spine.Unity.Editor {
if (EditorGUI.EndChangeCheck()) { if (EditorGUI.EndChangeCheck()) {
EditorPrefs.SetBool(SHOW_HIERARCHY_ICONS_KEY, showHierarchyIcons); EditorPrefs.SetBool(SHOW_HIERARCHY_ICONS_KEY, showHierarchyIcons);
#if UNITY_2017_2_OR_NEWER #if UNITY_2017_2_OR_NEWER
HierarchyIconsOnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode); SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged(PlayModeStateChange.EnteredEditMode);
#else #else
HierarchyIconsOnPlaymodeStateChanged(); SpineEditorHierarchyHandler.HierarchyIconsOnPlaymodeStateChanged();
#endif #endif
} }
@ -319,10 +316,9 @@ namespace Spine.Unity.Editor {
#endregion #endregion
#region Drag and Drop Instantiation #region Drag and Drop Instantiation
public delegate Component InstantiateDelegate (SkeletonDataAsset skeletonDataAsset); public delegate Component InstantiateDelegate (SkeletonDataAsset skeletonDataAsset);
struct SpawnMenuData { public struct SpawnMenuData {
public Vector3 spawnPoint; public Vector3 spawnPoint;
public SkeletonDataAsset skeletonDataAsset; public SkeletonDataAsset skeletonDataAsset;
public InstantiateDelegate instantiateDelegate; public InstantiateDelegate instantiateDelegate;
@ -335,7 +331,7 @@ namespace Spine.Unity.Editor {
public bool isUI; public bool isUI;
} }
public static readonly List<SkeletonComponentSpawnType> additionalSpawnTypes = new List<SkeletonComponentSpawnType>(); internal static readonly List<SkeletonComponentSpawnType> additionalSpawnTypes = new List<SkeletonComponentSpawnType>();
static void SceneViewDragAndDrop (SceneView sceneview) { static void SceneViewDragAndDrop (SceneView sceneview) {
var current = UnityEngine.Event.current; var current = UnityEngine.Event.current;
@ -374,45 +370,6 @@ namespace Spine.Unity.Editor {
} }
} }
static void HierarchyDragAndDrop (int instanceId, Rect selectionRect) {
// HACK: Uses EditorApplication.hierarchyWindowItemOnGUI.
// Only works when there is at least one item in the scene.
var current = UnityEngine.Event.current;
var eventType = current.type;
bool isDraggingEvent = eventType == EventType.DragUpdated;
bool isDropEvent = eventType == EventType.DragPerform;
if (isDraggingEvent || isDropEvent) {
var mouseOverWindow = EditorWindow.mouseOverWindow;
if (mouseOverWindow != null) {
// One, existing, valid SkeletonDataAsset
var references = DragAndDrop.objectReferences;
if (references.Length == 1) {
var skeletonDataAsset = references[0] as SkeletonDataAsset;
if (skeletonDataAsset != null && skeletonDataAsset.GetSkeletonData(true) != null) {
// Allow drag-and-dropping anywhere in the Hierarchy Window.
// HACK: string-compare because we can't get its type via reflection.
const string HierarchyWindow = "UnityEditor.SceneHierarchyWindow";
if (HierarchyWindow.Equals(mouseOverWindow.GetType().ToString(), System.StringComparison.Ordinal)) {
if (isDraggingEvent) {
DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
current.Use();
} else if (isDropEvent) {
ShowInstantiateContextMenu(skeletonDataAsset, Vector3.zero);
DragAndDrop.AcceptDrag();
current.Use();
return;
}
}
}
}
}
}
}
public static void ShowInstantiateContextMenu (SkeletonDataAsset skeletonDataAsset, Vector3 spawnPoint) { public static void ShowInstantiateContextMenu (SkeletonDataAsset skeletonDataAsset, Vector3 spawnPoint) {
var menu = new GenericMenu(); var menu = new GenericMenu();
@ -450,8 +407,8 @@ namespace Spine.Unity.Editor {
menu.ShowAsContext(); menu.ShowAsContext();
} }
public static void HandleSkeletonComponentDrop (object menuData) { public static void HandleSkeletonComponentDrop (object spawnMenuData) {
var data = (SpawnMenuData)menuData; var data = (SpawnMenuData)spawnMenuData;
if (data.skeletonDataAsset.GetSkeletonData(true) == null) { if (data.skeletonDataAsset.GetSkeletonData(true) == null) {
EditorUtility.DisplayDialog("Invalid SkeletonDataAsset", "Unable to create Spine GameObject.\n\nPlease check your SkeletonDataAsset.", "Ok"); EditorUtility.DisplayDialog("Invalid SkeletonDataAsset", "Unable to create Spine GameObject.\n\nPlease check your SkeletonDataAsset.", "Ok");
@ -460,16 +417,15 @@ namespace Spine.Unity.Editor {
bool isUI = data.isUI; bool isUI = data.isUI;
GameObject newGameObject = null;
Component newSkeletonComponent = data.instantiateDelegate.Invoke(data.skeletonDataAsset); Component newSkeletonComponent = data.instantiateDelegate.Invoke(data.skeletonDataAsset);
newGameObject = newSkeletonComponent.gameObject; GameObject newGameObject = newSkeletonComponent.gameObject;
var transform = newGameObject.transform; Transform newTransform = newGameObject.transform;
var activeGameObject = Selection.activeGameObject; var activeGameObject = Selection.activeGameObject;
if (isUI && activeGameObject != null) if (isUI && activeGameObject != null)
transform.SetParent(activeGameObject.transform, false); newTransform.SetParent(activeGameObject.transform, false);
newGameObject.transform.position = isUI ? data.spawnPoint : RoundVector(data.spawnPoint, 2); newTransform.position = isUI ? data.spawnPoint : RoundVector(data.spawnPoint, 2);
if (isUI && (activeGameObject == null || activeGameObject.GetComponent<RectTransform>() == null)) if (isUI && (activeGameObject == null || activeGameObject.GetComponent<RectTransform>() == null))
Debug.Log("Created a UI Skeleton GameObject not under a RectTransform. It may not be visible until you parent it to a canvas."); Debug.Log("Created a UI Skeleton GameObject not under a RectTransform. It may not be visible until you parent it to a canvas.");
@ -505,72 +461,117 @@ namespace Spine.Unity.Editor {
#endregion #endregion
#region Hierarchy #region Hierarchy
#if UNITY_2017_2_OR_NEWER static class SpineEditorHierarchyHandler {
static void HierarchyIconsOnPlaymodeStateChanged (PlayModeStateChange stateChange) { static Dictionary<int, GameObject> skeletonRendererTable = new Dictionary<int, GameObject>();
#else static Dictionary<int, SkeletonUtilityBone> skeletonUtilityBoneTable = new Dictionary<int, SkeletonUtilityBone>();
static void HierarchyIconsOnPlaymodeStateChanged () { static Dictionary<int, BoundingBoxFollower> boundingBoxFollowerTable = new Dictionary<int, BoundingBoxFollower>();
#endif
skeletonRendererTable.Clear();
skeletonUtilityBoneTable.Clear();
boundingBoxFollowerTable.Clear();
EditorApplication.hierarchyWindowChanged -= HierarchyIconsOnChanged; #if UNITY_2017_2_OR_NEWER
EditorApplication.hierarchyWindowItemOnGUI -= HierarchyIconsOnGUI; internal static void HierarchyIconsOnPlaymodeStateChanged (PlayModeStateChange stateChange) {
#else
internal static void HierarchyIconsOnPlaymodeStateChanged () {
#endif
skeletonRendererTable.Clear();
skeletonUtilityBoneTable.Clear();
boundingBoxFollowerTable.Clear();
if (!Application.isPlaying && showHierarchyIcons) { EditorApplication.hierarchyWindowChanged -= HierarchyIconsOnChanged;
EditorApplication.hierarchyWindowChanged += HierarchyIconsOnChanged; EditorApplication.hierarchyWindowItemOnGUI -= HierarchyIconsOnGUI;
EditorApplication.hierarchyWindowItemOnGUI += HierarchyIconsOnGUI;
HierarchyIconsOnChanged(); if (!Application.isPlaying && showHierarchyIcons) {
EditorApplication.hierarchyWindowChanged += HierarchyIconsOnChanged;
EditorApplication.hierarchyWindowItemOnGUI += HierarchyIconsOnGUI;
HierarchyIconsOnChanged();
}
} }
}
static void HierarchyIconsOnChanged () { internal static void HierarchyIconsOnChanged () {
skeletonRendererTable.Clear(); skeletonRendererTable.Clear();
skeletonUtilityBoneTable.Clear(); skeletonUtilityBoneTable.Clear();
boundingBoxFollowerTable.Clear(); boundingBoxFollowerTable.Clear();
SkeletonRenderer[] arr = Object.FindObjectsOfType<SkeletonRenderer>(); SkeletonRenderer[] arr = Object.FindObjectsOfType<SkeletonRenderer>();
foreach (SkeletonRenderer r in arr) foreach (SkeletonRenderer r in arr)
skeletonRendererTable[r.gameObject.GetInstanceID()] = r.gameObject; skeletonRendererTable[r.gameObject.GetInstanceID()] = r.gameObject;
SkeletonUtilityBone[] boneArr = Object.FindObjectsOfType<SkeletonUtilityBone>(); SkeletonUtilityBone[] boneArr = Object.FindObjectsOfType<SkeletonUtilityBone>();
foreach (SkeletonUtilityBone b in boneArr) foreach (SkeletonUtilityBone b in boneArr)
skeletonUtilityBoneTable[b.gameObject.GetInstanceID()] = b; skeletonUtilityBoneTable[b.gameObject.GetInstanceID()] = b;
BoundingBoxFollower[] bbfArr = Object.FindObjectsOfType<BoundingBoxFollower>(); BoundingBoxFollower[] bbfArr = Object.FindObjectsOfType<BoundingBoxFollower>();
foreach (BoundingBoxFollower bbf in bbfArr) foreach (BoundingBoxFollower bbf in bbfArr)
boundingBoxFollowerTable[bbf.gameObject.GetInstanceID()] = bbf; boundingBoxFollowerTable[bbf.gameObject.GetInstanceID()] = bbf;
} }
static void HierarchyIconsOnGUI (int instanceId, Rect selectionRect) { internal static void HierarchyIconsOnGUI (int instanceId, Rect selectionRect) {
Rect r = new Rect(selectionRect); Rect r = new Rect(selectionRect);
if (skeletonRendererTable.ContainsKey(instanceId)) { if (skeletonRendererTable.ContainsKey(instanceId)) {
r.x = r.width - 15; r.x = r.width - 15;
r.width = 15; r.width = 15;
GUI.Label(r, Icons.spine); GUI.Label(r, Icons.spine);
} else if (skeletonUtilityBoneTable.ContainsKey(instanceId)) { } else if (skeletonUtilityBoneTable.ContainsKey(instanceId)) {
r.x -= 26; r.x -= 26;
if (skeletonUtilityBoneTable[instanceId] != null) { if (skeletonUtilityBoneTable[instanceId] != null) {
if (skeletonUtilityBoneTable[instanceId].transform.childCount == 0) if (skeletonUtilityBoneTable[instanceId].transform.childCount == 0)
r.x += 13; r.x += 13;
r.y += 2; r.y += 2;
r.width = 13; r.width = 13;
r.height = 13; r.height = 13;
if (skeletonUtilityBoneTable[instanceId].mode == SkeletonUtilityBone.Mode.Follow) if (skeletonUtilityBoneTable[instanceId].mode == SkeletonUtilityBone.Mode.Follow)
GUI.DrawTexture(r, Icons.bone); GUI.DrawTexture(r, Icons.bone);
else else
GUI.DrawTexture(r, Icons.poseBones); GUI.DrawTexture(r, Icons.poseBones);
}
} else if (boundingBoxFollowerTable.ContainsKey(instanceId)) {
r.x -= 26;
if (boundingBoxFollowerTable[instanceId] != null) {
if (boundingBoxFollowerTable[instanceId].transform.childCount == 0)
r.x += 13;
r.y += 2;
r.width = 13;
r.height = 13;
GUI.DrawTexture(r, Icons.boundingBox);
}
} }
} else if (boundingBoxFollowerTable.ContainsKey(instanceId)) { }
r.x -= 26;
if (boundingBoxFollowerTable[instanceId] != null) { internal static void HierarchyDragAndDrop (int instanceId, Rect selectionRect) {
if (boundingBoxFollowerTable[instanceId].transform.childCount == 0) // HACK: Uses EditorApplication.hierarchyWindowItemOnGUI.
r.x += 13; // Only works when there is at least one item in the scene.
r.y += 2; var current = UnityEngine.Event.current;
r.width = 13; var eventType = current.type;
r.height = 13; bool isDraggingEvent = eventType == EventType.DragUpdated;
GUI.DrawTexture(r, Icons.boundingBox); bool isDropEvent = eventType == EventType.DragPerform;
if (isDraggingEvent || isDropEvent) {
var mouseOverWindow = EditorWindow.mouseOverWindow;
if (mouseOverWindow != null) {
// One, existing, valid SkeletonDataAsset
var references = DragAndDrop.objectReferences;
if (references.Length == 1) {
var skeletonDataAsset = references[0] as SkeletonDataAsset;
if (skeletonDataAsset != null && skeletonDataAsset.GetSkeletonData(true) != null) {
// Allow drag-and-dropping anywhere in the Hierarchy Window.
// HACK: string-compare because we can't get its type via reflection.
const string HierarchyWindow = "UnityEditor.SceneHierarchyWindow";
if (HierarchyWindow.Equals(mouseOverWindow.GetType().ToString(), System.StringComparison.Ordinal)) {
if (isDraggingEvent) {
DragAndDrop.visualMode = DragAndDropVisualMode.Copy;
current.Use();
} else if (isDropEvent) {
ShowInstantiateContextMenu(skeletonDataAsset, Vector3.zero);
DragAndDrop.AcceptDrag();
current.Use();
return;
}
}
}
}
}
} }
} }
} }
#endregion #endregion
@ -665,7 +666,7 @@ namespace Spine.Unity.Editor {
bool resolved = false; bool resolved = false;
while (!resolved) { while (!resolved) {
var filename = Path.GetFileNameWithoutExtension(sp); string filename = Path.GetFileNameWithoutExtension(sp);
int result = EditorUtility.DisplayDialogComplex( int result = EditorUtility.DisplayDialogComplex(
string.Format("AtlasAsset for \"{0}\"", filename), string.Format("AtlasAsset for \"{0}\"", filename),
string.Format("Could not automatically set the AtlasAsset for \"{0}\". You may set it manually.", filename), string.Format("Could not automatically set the AtlasAsset for \"{0}\". You may set it manually.", filename),
@ -1653,11 +1654,12 @@ namespace Spine.Unity.Editor {
public static GUIStyle BoneNameStyle { public static GUIStyle BoneNameStyle {
get { get {
if (_boneNameStyle == null) { if (_boneNameStyle == null) {
_boneNameStyle = new GUIStyle(EditorStyles.whiteMiniLabel); _boneNameStyle = new GUIStyle(EditorStyles.whiteMiniLabel) {
_boneNameStyle.alignment = TextAnchor.MiddleCenter; alignment = TextAnchor.MiddleCenter,
_boneNameStyle.stretchWidth = true; stretchWidth = true,
_boneNameStyle.padding = new RectOffset(0, 0, 0, 0); padding = new RectOffset(0, 0, 0, 0),
_boneNameStyle.contentOffset = new Vector2(-5f, 0f); contentOffset = new Vector2(-5f, 0f)
};
} }
return _boneNameStyle; return _boneNameStyle;
} }
@ -1979,7 +1981,7 @@ namespace Spine.Unity.Editor {
} }
static void DrawArrowhead (Matrix4x4 m) { static void DrawArrowhead (Matrix4x4 m) {
var s = SpineHandles.handleScale; float s = SpineHandles.handleScale;
m.m00 *= s; m.m00 *= s;
m.m01 *= s; m.m01 *= s;
m.m02 *= s; m.m02 *= s;