mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-26 22:49:01 +08:00
[unity] Updated editors. (undo, sceneview, context menus)
This commit is contained in:
parent
1ad7ffc850
commit
a6d9915c95
@ -51,6 +51,51 @@ namespace Spine.Unity.Editor {
|
|||||||
targetBoneFollower.SkeletonRenderer.Initialize(false);
|
targetBoneFollower.SkeletonRenderer.Initialize(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void OnSceneGUI () {
|
||||||
|
if (targetBoneFollower == null) return;
|
||||||
|
var skeletonRendererComponent = targetBoneFollower.skeletonRenderer;
|
||||||
|
if (skeletonRendererComponent == null) return;
|
||||||
|
|
||||||
|
var transform = skeletonRendererComponent.transform;
|
||||||
|
var skeleton = skeletonRendererComponent.skeleton;
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(targetBoneFollower.boneName)) {
|
||||||
|
SpineHandles.DrawBones(transform, skeleton);
|
||||||
|
SpineHandles.DrawBoneNames(transform, skeleton);
|
||||||
|
Handles.Label(targetBoneFollower.transform.position, "No bone selected", EditorStyles.helpBox);
|
||||||
|
} else {
|
||||||
|
var targetBone = targetBoneFollower.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");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate
|
||||||
|
[MenuItem ("CONTEXT/SkeletonRenderer/Add BoneFollower GameObject", true)]
|
||||||
|
static bool ValidateAddBoneFollowerGameObject (MenuCommand cmd) {
|
||||||
|
var skeletonRenderer = cmd.context as SkeletonRenderer;
|
||||||
|
return skeletonRenderer.valid;
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
override public void OnInspectorGUI () {
|
override public void OnInspectorGUI () {
|
||||||
if (needsReset) {
|
if (needsReset) {
|
||||||
targetBoneFollower.Initialize();
|
targetBoneFollower.Initialize();
|
||||||
|
|||||||
@ -531,7 +531,7 @@ namespace Spine.Unity.Editor {
|
|||||||
bool abortSkeletonImport = false;
|
bool abortSkeletonImport = false;
|
||||||
foreach (string sp in skeletonPaths) {
|
foreach (string sp in skeletonPaths) {
|
||||||
if (!reimport && CheckForValidSkeletonData(sp)) {
|
if (!reimport && CheckForValidSkeletonData(sp)) {
|
||||||
ClearExistingSkeletonData(sp);
|
ReloadSkeletonData(sp);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -596,7 +596,7 @@ namespace Spine.Unity.Editor {
|
|||||||
// Any post processing of images
|
// Any post processing of images
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ClearExistingSkeletonData (string skeletonJSONPath) {
|
static void ReloadSkeletonData (string skeletonJSONPath) {
|
||||||
string dir = Path.GetDirectoryName(skeletonJSONPath);
|
string dir = Path.GetDirectoryName(skeletonJSONPath);
|
||||||
TextAsset textAsset = (TextAsset)AssetDatabase.LoadAssetAtPath(skeletonJSONPath, typeof(TextAsset));
|
TextAsset textAsset = (TextAsset)AssetDatabase.LoadAssetAtPath(skeletonJSONPath, typeof(TextAsset));
|
||||||
DirectoryInfo dirInfo = new DirectoryInfo(dir);
|
DirectoryInfo dirInfo = new DirectoryInfo(dir);
|
||||||
@ -611,6 +611,7 @@ namespace Spine.Unity.Editor {
|
|||||||
if (Selection.activeObject == skeletonDataAsset)
|
if (Selection.activeObject == skeletonDataAsset)
|
||||||
Selection.activeObject = null;
|
Selection.activeObject = null;
|
||||||
|
|
||||||
|
Debug.LogFormat("Changes to '{0}' detected. Clearing SkeletonDataAsset: {1}", skeletonJSONPath, localPath);
|
||||||
skeletonDataAsset.Clear();
|
skeletonDataAsset.Clear();
|
||||||
|
|
||||||
string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(skeletonDataAsset));
|
string guid = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(skeletonDataAsset));
|
||||||
@ -643,9 +644,8 @@ namespace Spine.Unity.Editor {
|
|||||||
// if (currentHash == null || lastHash != currentHash)
|
// if (currentHash == null || lastHash != currentHash)
|
||||||
// Do any upkeep on synchronized assets
|
// Do any upkeep on synchronized assets
|
||||||
|
|
||||||
if (currentHash != null) {
|
if (currentHash != null)
|
||||||
EditorPrefs.SetString(guid + "_hash", currentHash);
|
EditorPrefs.SetString(guid + "_hash", currentHash);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1399,17 +1399,18 @@ namespace Spine.Unity.Editor {
|
|||||||
public static Color TransformContraintColor { get { return new Color(170/255f, 226/255f, 35/255f); } }
|
public static Color TransformContraintColor { get { return new Color(170/255f, 226/255f, 35/255f); } }
|
||||||
public static Color IkColor { get { return new Color(228/255f,90/255f,43/255f); } }
|
public static Color IkColor { get { return new Color(228/255f,90/255f,43/255f); } }
|
||||||
|
|
||||||
|
static Vector3[] _boneMeshVerts = {
|
||||||
|
new Vector3(0, 0, 0),
|
||||||
|
new Vector3(0.1f, 0.1f, 0),
|
||||||
|
new Vector3(1, 0, 0),
|
||||||
|
new Vector3(0.1f, -0.1f, 0)
|
||||||
|
};
|
||||||
static Mesh _boneMesh;
|
static Mesh _boneMesh;
|
||||||
public static Mesh BoneMesh {
|
public static Mesh BoneMesh {
|
||||||
get {
|
get {
|
||||||
if (_boneMesh == null) {
|
if (_boneMesh == null) {
|
||||||
_boneMesh = new Mesh {
|
_boneMesh = new Mesh {
|
||||||
vertices = new [] {
|
vertices = _boneMeshVerts,
|
||||||
new Vector3(0, 0, 0),
|
|
||||||
new Vector3(0.1f, 0.1f, 0),
|
|
||||||
new Vector3(1, 0, 0),
|
|
||||||
new Vector3(0.1f, -0.1f, 0)
|
|
||||||
},
|
|
||||||
uv = new Vector2[4],
|
uv = new Vector2[4],
|
||||||
triangles = new [] { 0, 1, 2, 2, 3, 0 }
|
triangles = new [] { 0, 1, 2, 2, 3, 0 }
|
||||||
};
|
};
|
||||||
@ -1506,6 +1507,34 @@ namespace Spine.Unity.Editor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Vector3[] _boneWireBuffer = new Vector3[5];
|
||||||
|
static Vector3[] GetBoneWireBuffer (Matrix4x4 m) {
|
||||||
|
for (int i = 0, n = _boneMeshVerts.Length; i < n; i++)
|
||||||
|
_boneWireBuffer[i] = m.MultiplyPoint(_boneMeshVerts[i]);
|
||||||
|
|
||||||
|
_boneWireBuffer[4] = _boneWireBuffer[0]; // closed polygon.
|
||||||
|
return _boneWireBuffer;
|
||||||
|
}
|
||||||
|
public static void DrawBoneWireframe (Transform transform, Bone b, Color color) {
|
||||||
|
Handles.color = color;
|
||||||
|
var pos = new Vector3(b.WorldX, b.WorldY, 0);
|
||||||
|
float length = b.Data.Length;
|
||||||
|
|
||||||
|
if (length > 0) {
|
||||||
|
Quaternion rot = Quaternion.Euler(0, 0, b.WorldRotationX);
|
||||||
|
Vector3 scale = Vector3.one * length * b.WorldScaleX;
|
||||||
|
const float my = 1.5f;
|
||||||
|
scale.y *= (SpineHandles.handleScale + 1f) * 0.5f;
|
||||||
|
scale.y = Mathf.Clamp(scale.x, -my, my);
|
||||||
|
Handles.DrawPolyLine(GetBoneWireBuffer(transform.localToWorldMatrix * Matrix4x4.TRS(pos, rot, scale)));
|
||||||
|
var wp = transform.TransformPoint(pos);
|
||||||
|
DrawBoneCircle(wp, color, transform.forward);
|
||||||
|
} else {
|
||||||
|
var wp = transform.TransformPoint(pos);
|
||||||
|
DrawBoneCircle(wp, color, transform.forward);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void DrawBone (Transform transform, Bone b, float boneScale) {
|
public static void DrawBone (Transform transform, Bone b, float boneScale) {
|
||||||
var pos = new Vector3(b.WorldX, b.WorldY, 0);
|
var pos = new Vector3(b.WorldX, b.WorldY, 0);
|
||||||
float length = b.Data.Length;
|
float length = b.Data.Length;
|
||||||
|
|||||||
@ -175,11 +175,12 @@ namespace Spine.Unity.Editor {
|
|||||||
#region Menus
|
#region Menus
|
||||||
[MenuItem("CONTEXT/SkeletonRenderer/Add BoundingBoxFollower GameObject")]
|
[MenuItem("CONTEXT/SkeletonRenderer/Add BoundingBoxFollower GameObject")]
|
||||||
static void AddBoundingBoxFollowerChild (MenuCommand command) {
|
static void AddBoundingBoxFollowerChild (MenuCommand command) {
|
||||||
AddBoundingBoxFollowerChild((SkeletonRenderer)command.context);
|
var go = AddBoundingBoxFollowerChild((SkeletonRenderer)command.context);
|
||||||
|
Undo.RegisterCreatedObjectUndo(go, "Add BoundingBoxFollower");
|
||||||
}
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
static void AddBoundingBoxFollowerChild (SkeletonRenderer sr, BoundingBoxFollower original = null) {
|
static GameObject AddBoundingBoxFollowerChild (SkeletonRenderer sr, BoundingBoxFollower original = null) {
|
||||||
var go = new GameObject("BoundingBoxFollower");
|
var go = new GameObject("BoundingBoxFollower");
|
||||||
go.transform.SetParent(sr.transform, false);
|
go.transform.SetParent(sr.transform, false);
|
||||||
var newFollower = go.AddComponent<BoundingBoxFollower>();
|
var newFollower = go.AddComponent<BoundingBoxFollower>();
|
||||||
@ -196,6 +197,7 @@ namespace Spine.Unity.Editor {
|
|||||||
|
|
||||||
Selection.activeGameObject = go;
|
Selection.activeGameObject = go;
|
||||||
EditorGUIUtility.PingObject(go);
|
EditorGUIUtility.PingObject(go);
|
||||||
|
return go;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -266,7 +266,9 @@ namespace Spine.Unity.Modules {
|
|||||||
[MenuItem ("CONTEXT/SkeletonRenderer/Add Skeleton Render Separator")]
|
[MenuItem ("CONTEXT/SkeletonRenderer/Add Skeleton Render Separator")]
|
||||||
static void AddRenderSeparatorComponent (MenuCommand cmd) {
|
static void AddRenderSeparatorComponent (MenuCommand cmd) {
|
||||||
var skeletonRenderer = cmd.context as SkeletonRenderer;
|
var skeletonRenderer = cmd.context as SkeletonRenderer;
|
||||||
skeletonRenderer.gameObject.AddComponent<SkeletonRenderSeparator>();
|
var newComponent = skeletonRenderer.gameObject.AddComponent<SkeletonRenderSeparator>();
|
||||||
|
|
||||||
|
Undo.RegisterCreatedObjectUndo(newComponent, "Add SkeletonRenderSeparator");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate
|
// Validate
|
||||||
|
|||||||
@ -233,7 +233,6 @@ namespace Spine.Unity.Editor {
|
|||||||
menu.AddItem(new GUIContent(bones.Items[i].Data.Name), bones.Items[i].Data.Name == current, callback, bones.Items[i]);
|
menu.AddItem(new GUIContent(bones.Items[i].Data.Name), bones.Items[i].Data.Name == current, callback, bones.Items[i]);
|
||||||
|
|
||||||
menu.ShowAsContext();
|
menu.ShowAsContext();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TargetBoneSelected (object obj) {
|
void TargetBoneSelected (object obj) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user