|
@@ -33,49 +33,85 @@
|
|
|
using System.Collections.Generic;
|
|
|
using UnityEngine;
|
|
|
using UnityEditor;
|
|
|
-using Spine.Unity.Modules;
|
|
|
using UnityEditor.AnimatedValues;
|
|
|
|
|
|
namespace Spine.Unity.Editor {
|
|
|
using Editor = UnityEditor.Editor;
|
|
|
using Icons = SpineEditorUtilities.Icons;
|
|
|
|
|
|
- [CustomEditor(typeof(SkeletonDebug))]
|
|
|
- public class SkeletonDebugEditor : Editor {
|
|
|
+ public class SkeletonDebugWindow : EditorWindow {
|
|
|
+
|
|
|
+ const bool IsUtilityWindow = true;
|
|
|
+
|
|
|
+ [MenuItem("CONTEXT/SkeletonRenderer/Open Skeleton Debug Window", false, 5000)]
|
|
|
+ public static void Init () {
|
|
|
+ var window = EditorWindow.GetWindow<SkeletonDebugWindow>(IsUtilityWindow);
|
|
|
+ window.minSize = new Vector2(330f, 360f);
|
|
|
+ window.maxSize = new Vector2(600f, 4000f);
|
|
|
+ window.titleContent = new GUIContent("Skeleton Debug", Icons.spine);
|
|
|
+ window.Show();
|
|
|
+ window.OnSelectionChange();
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
- static AnimBool showSlotsTree = new AnimBool(false);
|
|
|
static AnimBool showSkeleton = new AnimBool(true);
|
|
|
+ static AnimBool showSlotsTree = new AnimBool(false);
|
|
|
static AnimBool showConstraintsTree = new AnimBool(false);
|
|
|
+ static AnimBool showDrawOrderTree = new AnimBool(false);
|
|
|
+ static AnimBool showEventDataTree = new AnimBool(false);
|
|
|
+ static AnimBool showInspectBoneTree = new AnimBool(false);
|
|
|
|
|
|
- protected static bool showBoneNames, showPaths = true, showShapes = true, showConstraints = true;
|
|
|
+ Vector2 scrollPos;
|
|
|
|
|
|
GUIContent SlotsRootLabel, SkeletonRootLabel;
|
|
|
GUIStyle BoldFoldoutStyle;
|
|
|
|
|
|
- SkeletonDebug skeletonDebug;
|
|
|
- SkeletonRenderer skeletonRenderer;
|
|
|
+ public SkeletonRenderer skeletonRenderer;
|
|
|
Skeleton skeleton;
|
|
|
-
|
|
|
Skin activeSkin;
|
|
|
-
|
|
|
bool isPrefab;
|
|
|
|
|
|
- readonly Dictionary<Slot, List<Attachment>> attachmentTable = new Dictionary<Slot, List<Attachment>>();
|
|
|
+ SerializedProperty bpo;
|
|
|
+ Bone bone;
|
|
|
|
|
|
- #region Menus
|
|
|
- [MenuItem("CONTEXT/SkeletonRenderer/Debug with SkeletonDebug", false, 5000)]
|
|
|
- static void AddSkeletonDebug (MenuCommand command) {
|
|
|
- var go = ((SkeletonRenderer)command.context).gameObject;
|
|
|
- go.AddComponent<SkeletonDebug>();
|
|
|
- Undo.RegisterCreatedObjectUndo(go, "Add SkeletonDebug");
|
|
|
- }
|
|
|
- #endregion
|
|
|
+ [SpineBone(dataField:"skeletonRenderer")]
|
|
|
+ public string boneName;
|
|
|
+
|
|
|
+ readonly Dictionary<Slot, List<Attachment>> attachmentTable = new Dictionary<Slot, List<Attachment>>();
|
|
|
|
|
|
- void OnEnable () {
|
|
|
- Initialize();
|
|
|
+ void OnSelectionChange () {
|
|
|
+ bool noSkeletonRenderer = false;
|
|
|
+
|
|
|
+ var selectedObject = Selection.activeGameObject;
|
|
|
+ if (selectedObject == null) {
|
|
|
+ noSkeletonRenderer = true;
|
|
|
+ } else {
|
|
|
+ var selectedSkeletonRenderer = selectedObject.GetComponent<SkeletonRenderer>();
|
|
|
+ if (selectedSkeletonRenderer == null) {
|
|
|
+ noSkeletonRenderer = true;
|
|
|
+ } else if (skeletonRenderer != selectedSkeletonRenderer) {
|
|
|
+ skeletonRenderer = selectedSkeletonRenderer;
|
|
|
+ skeletonRenderer.Initialize(false);
|
|
|
+ skeletonRenderer.LateUpdate();
|
|
|
+ skeleton = skeletonRenderer.skeleton;
|
|
|
+ isPrefab |= PrefabUtility.GetPrefabType(selectedObject) == PrefabType.Prefab;
|
|
|
+ UpdateAttachments();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (noSkeletonRenderer) {
|
|
|
+ skeletonRenderer = null;
|
|
|
+ skeleton = null;
|
|
|
+ attachmentTable.Clear();
|
|
|
+ isPrefab = false;
|
|
|
+ boneName = string.Empty;
|
|
|
+ bone = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ Repaint();
|
|
|
}
|
|
|
|
|
|
- void Initialize () {
|
|
|
+ void OnGUI () {
|
|
|
if (SlotsRootLabel == null) {
|
|
|
SlotsRootLabel = new GUIContent("Slots", Icons.slotRoot);
|
|
|
SkeletonRootLabel = new GUIContent("Skeleton", Icons.skeleton);
|
|
@@ -85,39 +121,13 @@ namespace Spine.Unity.Editor {
|
|
|
BoldFoldoutStyle.fixedWidth = 0;
|
|
|
}
|
|
|
|
|
|
- if (skeleton == null) {
|
|
|
- skeletonDebug = (SkeletonDebug)target;
|
|
|
- skeletonRenderer = skeletonDebug.GetComponent<SkeletonRenderer>();
|
|
|
- skeletonRenderer.Initialize(false);
|
|
|
- skeletonRenderer.LateUpdate();
|
|
|
- skeleton = skeletonRenderer.skeleton;
|
|
|
- }
|
|
|
-
|
|
|
- if (attachmentTable.Count == 0) UpdateAttachments();
|
|
|
-
|
|
|
- if (!skeletonRenderer.valid) return;
|
|
|
- isPrefab |= PrefabUtility.GetPrefabType(this.target) == PrefabType.Prefab;
|
|
|
- }
|
|
|
-
|
|
|
- public void OnSceneGUI () {
|
|
|
- var transform = skeletonRenderer.transform;
|
|
|
- if (skeleton == null) return;
|
|
|
- if (isPrefab) return;
|
|
|
-
|
|
|
- if (showPaths) SpineHandles.DrawPaths(transform, skeleton);
|
|
|
- if (showConstraints) SpineHandles.DrawConstraints(transform, skeleton);
|
|
|
- if (showBoneNames) SpineHandles.DrawBoneNames(transform, skeleton);
|
|
|
- if (showShapes) SpineHandles.DrawBoundingBoxes(transform, skeleton);
|
|
|
- }
|
|
|
-
|
|
|
- public override void OnInspectorGUI () {
|
|
|
- Initialize();
|
|
|
-
|
|
|
bool requireRepaint = false;
|
|
|
+ EditorGUILayout.Space();
|
|
|
+ EditorGUI.BeginDisabledGroup(true);
|
|
|
+ EditorGUILayout.ObjectField("Debug Selection", skeletonRenderer, typeof(SkeletonRenderer), true);
|
|
|
+ EditorGUI.EndDisabledGroup();
|
|
|
|
|
|
- if (skeletonRenderer.skeleton != skeleton || activeSkin != skeleton.Skin) {
|
|
|
- UpdateAttachments();
|
|
|
- }
|
|
|
+ if (skeleton == null || skeletonRenderer == null || !skeletonRenderer.valid) return;
|
|
|
|
|
|
if (isPrefab) {
|
|
|
GUILayout.Label(new GUIContent("Cannot edit Prefabs", Icons.warning));
|
|
@@ -129,37 +139,96 @@ namespace Spine.Unity.Editor {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- EditorGUILayout.HelpBox("This is a debug component. Changes are not serialized.", MessageType.Info);
|
|
|
+ if (activeSkin != skeleton.Skin)
|
|
|
+ UpdateAttachments();
|
|
|
+
|
|
|
+ scrollPos = EditorGUILayout.BeginScrollView(scrollPos);
|
|
|
+
|
|
|
+ using (new SpineInspectorUtility.BoxScope(false)) {
|
|
|
+ if (SpineInspectorUtility.CenteredButton(new GUIContent("Skeleton.SetToSetupPose()"))) {
|
|
|
+ skeleton.SetToSetupPose();
|
|
|
+ requireRepaint = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ EditorGUI.BeginChangeCheck();
|
|
|
+ EditorGUILayout.LabelField("Scene View", EditorStyles.boldLabel);
|
|
|
+ using (new SpineInspectorUtility.LabelWidthScope()) {
|
|
|
+ SkeletonRendererInspector.showBoneNames = EditorGUILayout.Toggle("Show Bone Names", SkeletonRendererInspector.showBoneNames);
|
|
|
+ SkeletonRendererInspector.showPaths = EditorGUILayout.Toggle("Show Paths", SkeletonRendererInspector.showPaths);
|
|
|
+ SkeletonRendererInspector.showShapes = EditorGUILayout.Toggle("Show Shapes", SkeletonRendererInspector.showShapes);
|
|
|
+ SkeletonRendererInspector.showConstraints = EditorGUILayout.Toggle("Show Constraints", SkeletonRendererInspector.showConstraints);
|
|
|
+ }
|
|
|
+ requireRepaint |= EditorGUI.EndChangeCheck();
|
|
|
|
|
|
- using (new SpineInspectorUtility.BoxScope()) {
|
|
|
|
|
|
// Skeleton
|
|
|
showSkeleton.target = EditorGUILayout.Foldout(showSkeleton.target, SkeletonRootLabel, BoldFoldoutStyle);
|
|
|
if (showSkeleton.faded > 0) {
|
|
|
- using (new EditorGUILayout.FadeGroupScope(showSkeleton.faded)) {
|
|
|
- using (new SpineInspectorUtility.IndentScope()) {
|
|
|
+ using (new SpineInspectorUtility.IndentScope()) {
|
|
|
+ using (new EditorGUILayout.FadeGroupScope(showSkeleton.faded)) {
|
|
|
EditorGUI.BeginChangeCheck();
|
|
|
+
|
|
|
+ // Flip
|
|
|
+ EditorGUILayout.BeginHorizontal(GUILayout.MaxWidth(160f));
|
|
|
+ EditorGUILayout.LabelField("Flip", GUILayout.MaxWidth(EditorGUIUtility.labelWidth - 20f));
|
|
|
+ skeleton.FlipX = EditorGUILayout.ToggleLeft(".FlipX", skeleton.FlipX, GUILayout.MaxWidth(70f));
|
|
|
+ skeleton.FlipY = EditorGUILayout.ToggleLeft(".FlipY", skeleton.FlipY, GUILayout.MaxWidth(70f));
|
|
|
+ GUILayout.EndHorizontal();
|
|
|
+
|
|
|
+ // Color
|
|
|
skeleton.SetColor(EditorGUILayout.ColorField(".R .G .B .A", skeleton.GetColor()));
|
|
|
- skeleton.FlipX = EditorGUILayout.ToggleLeft(".FlipX", skeleton.FlipX);
|
|
|
- skeleton.FlipY = EditorGUILayout.ToggleLeft(".FlipY", skeleton.FlipY);
|
|
|
-
|
|
|
- EditorGUILayout.Space();
|
|
|
- using (new SpineInspectorUtility.LabelWidthScope()) {
|
|
|
- showBoneNames = EditorGUILayout.Toggle("Show Bone Names", showBoneNames);
|
|
|
- showPaths = EditorGUILayout.Toggle("Show Paths", showPaths);
|
|
|
- showShapes = EditorGUILayout.Toggle("Show Shapes", showShapes);
|
|
|
- showConstraints = EditorGUILayout.Toggle("Show Constraints", showConstraints);
|
|
|
- }
|
|
|
+
|
|
|
requireRepaint |= EditorGUI.EndChangeCheck();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // Bone
|
|
|
+ showInspectBoneTree.target = EditorGUILayout.Foldout(showInspectBoneTree.target, new GUIContent("Bone", Icons.bone), BoldFoldoutStyle);
|
|
|
+ if (showInspectBoneTree.faded > 0) {
|
|
|
+ using (new SpineInspectorUtility.IndentScope()) {
|
|
|
+ using (new EditorGUILayout.FadeGroupScope(showInspectBoneTree.faded)) {
|
|
|
+ if (bpo == null) bpo = new SerializedObject(this).FindProperty("boneName");
|
|
|
+ EditorGUILayout.PropertyField(bpo);
|
|
|
+ if (!string.IsNullOrEmpty(bpo.stringValue)) {
|
|
|
+ if (bone == null || bone.Data.Name != bpo.stringValue) {
|
|
|
+ bone = skeleton.FindBone(bpo.stringValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (bone != null) {
|
|
|
+ using (new EditorGUI.DisabledGroupScope(true)) {
|
|
|
+ var boneParent = bone.Parent;
|
|
|
+ if (boneParent != null) EditorGUILayout.TextField("parent", boneParent.Data.Name);
|
|
|
+ EditorGUILayout.Space();
|
|
|
+
|
|
|
+ EditorGUILayout.Slider("Local Rotation", bone.Rotation, -180f, 180f);
|
|
|
+ EditorGUILayout.Vector2Field("Local Position", new Vector2(bone.X, bone.Y));
|
|
|
+ EditorGUILayout.Vector2Field("Local Scale", new Vector2(bone.ScaleX, bone.ScaleY));
|
|
|
+ EditorGUILayout.Vector2Field("Local Shear", new Vector2(bone.ShearX, bone.ShearY));
|
|
|
+// EditorGUILayout.Space();
|
|
|
+// EditorGUILayout.LabelField("LocalToWorld Matrix");
|
|
|
+// EditorGUILayout.Vector2Field("AB", new Vector2(bone.A, bone.B));
|
|
|
+// EditorGUILayout.Vector2Field("CD", new Vector2(bone.C, bone.D));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ requireRepaint = true;
|
|
|
+ } else {
|
|
|
+ bone = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
// Slots
|
|
|
int preSlotsIndent = EditorGUI.indentLevel;
|
|
|
showSlotsTree.target = EditorGUILayout.Foldout(showSlotsTree.target, SlotsRootLabel, BoldFoldoutStyle);
|
|
|
if (showSlotsTree.faded > 0) {
|
|
|
using (new EditorGUILayout.FadeGroupScope(showSlotsTree.faded)) {
|
|
|
+ if (SpineInspectorUtility.CenteredButton(new GUIContent("Skeleton.SetSlotsToSetupPose()"))) {
|
|
|
+ skeleton.SetSlotsToSetupPose();
|
|
|
+ requireRepaint = true;
|
|
|
+ }
|
|
|
+
|
|
|
int baseIndent = EditorGUI.indentLevel;
|
|
|
foreach (KeyValuePair<Slot, List<Attachment>> pair in attachmentTable) {
|
|
|
Slot slot = pair.Key;
|
|
@@ -194,22 +263,22 @@ namespace Spine.Unity.Editor {
|
|
|
|
|
|
// Constraints
|
|
|
const string NoneText = "<none>";
|
|
|
- showConstraintsTree.target = EditorGUILayout.Foldout(showConstraintsTree.target, "Constraints", BoldFoldoutStyle);
|
|
|
+ showConstraintsTree.target = EditorGUILayout.Foldout(showConstraintsTree.target, new GUIContent("Constraints", Icons.constraintRoot), BoldFoldoutStyle);
|
|
|
if (showConstraintsTree.faded > 0) {
|
|
|
- using (new EditorGUILayout.FadeGroupScope(showConstraintsTree.faded)) {
|
|
|
- using (new SpineInspectorUtility.IndentScope()) {
|
|
|
+ using (new SpineInspectorUtility.IndentScope()) {
|
|
|
+ using (new EditorGUILayout.FadeGroupScope(showConstraintsTree.faded)) {
|
|
|
const float MixMin = 0f;
|
|
|
const float MixMax = 1f;
|
|
|
|
|
|
- EditorGUILayout.LabelField(string.Format("IK Constraints ({0})", skeleton.IkConstraints.Count), EditorStyles.boldLabel);
|
|
|
+ EditorGUILayout.LabelField(new GUIContent(string.Format("IK Constraints ({0})", skeleton.IkConstraints.Count), Icons.constraintIK), EditorStyles.boldLabel);
|
|
|
using (new SpineInspectorUtility.IndentScope()) {
|
|
|
if (skeleton.IkConstraints.Count > 0) {
|
|
|
foreach (var c in skeleton.IkConstraints) {
|
|
|
- EditorGUILayout.LabelField(c.Data.Name);
|
|
|
+ EditorGUILayout.LabelField(new GUIContent(c.Data.Name, Icons.constraintIK));
|
|
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
|
- c.BendDirection = EditorGUILayout.Toggle("Bend Direction Positive", c.BendDirection > 0) ? 1 : -1;
|
|
|
c.Mix = EditorGUILayout.Slider("Mix", c.Mix, MixMin, MixMax);
|
|
|
+ c.BendDirection = EditorGUILayout.Toggle("Bend Direction +", c.BendDirection > 0) ? 1 : -1;
|
|
|
if (EditorGUI.EndChangeCheck()) requireRepaint = true;
|
|
|
|
|
|
EditorGUILayout.Space();
|
|
@@ -220,11 +289,11 @@ namespace Spine.Unity.Editor {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- EditorGUILayout.LabelField(string.Format("Transform Constraints ({0})", skeleton.TransformConstraints.Count), EditorStyles.boldLabel);
|
|
|
+ EditorGUILayout.LabelField(new GUIContent(string.Format("Transform Constraints ({0})", skeleton.TransformConstraints.Count), Icons.constraintTransform), EditorStyles.boldLabel);
|
|
|
using (new SpineInspectorUtility.IndentScope()) {
|
|
|
if (skeleton.TransformConstraints.Count > 0) {
|
|
|
foreach (var c in skeleton.TransformConstraints) {
|
|
|
- EditorGUILayout.LabelField(c.Data.Name);
|
|
|
+ EditorGUILayout.LabelField(new GUIContent(c.Data.Name, Icons.constraintTransform));
|
|
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
|
c.TranslateMix = EditorGUILayout.Slider("TranslateMix", c.TranslateMix, MixMin, MixMax);
|
|
@@ -240,11 +309,11 @@ namespace Spine.Unity.Editor {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- EditorGUILayout.LabelField(string.Format("Path Constraints ({0})", skeleton.PathConstraints.Count), EditorStyles.boldLabel);
|
|
|
+ EditorGUILayout.LabelField(new GUIContent(string.Format("Path Constraints ({0})", skeleton.PathConstraints.Count), Icons.constraintPath), EditorStyles.boldLabel);
|
|
|
using (new SpineInspectorUtility.IndentScope()) {
|
|
|
if (skeleton.PathConstraints.Count > 0) {
|
|
|
foreach (var c in skeleton.PathConstraints) {
|
|
|
- EditorGUILayout.LabelField(c.Data.Name);
|
|
|
+ EditorGUILayout.LabelField(new GUIContent(c.Data.Name, Icons.constraintPath));
|
|
|
EditorGUILayout.LabelField("PositionMode." + c.Data.PositionMode);
|
|
|
EditorGUILayout.LabelField("SpacingMode." + c.Data.SpacingMode);
|
|
|
EditorGUILayout.LabelField("RotateMode." + c.Data.RotateMode);
|
|
@@ -267,19 +336,69 @@ namespace Spine.Unity.Editor {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (showSlotsTree.isAnimating || showSkeleton.isAnimating || showConstraintsTree.isAnimating)
|
|
|
+ showDrawOrderTree.target = EditorGUILayout.Foldout(showDrawOrderTree.target, new GUIContent("Draw Order and Separators", Icons.slotRoot), BoldFoldoutStyle);
|
|
|
+ if (showDrawOrderTree.faded > 0) {
|
|
|
+ using (new SpineInspectorUtility.IndentScope()) {
|
|
|
+ using (new EditorGUILayout.FadeGroupScope(showDrawOrderTree.faded)) {
|
|
|
+
|
|
|
+ if (Application.isPlaying) {
|
|
|
+ foreach (var slot in skeleton.DrawOrder) {
|
|
|
+ if (skeletonRenderer.separatorSlots.Contains(slot)) EditorGUILayout.LabelField("------");
|
|
|
+ EditorGUILayout.LabelField(new GUIContent(slot.Data.Name, Icons.slot), GUILayout.ExpandWidth(false));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ foreach (var slot in skeleton.DrawOrder) {
|
|
|
+ var slotNames = skeletonRenderer.separatorSlotNames;
|
|
|
+ for (int i = 0, n = slotNames.Length; i < n; i++) {
|
|
|
+ if (string.Equals(slotNames[i], slot.Data.Name, System.StringComparison.Ordinal)) {
|
|
|
+ EditorGUILayout.LabelField("------");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ EditorGUILayout.LabelField(new GUIContent(slot.Data.Name, Icons.slot), GUILayout.ExpandWidth(false));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ showEventDataTree.target = EditorGUILayout.Foldout(showEventDataTree.target, new GUIContent("Events", Icons.userEvent), BoldFoldoutStyle);
|
|
|
+ if (showEventDataTree.faded > 0) {
|
|
|
+ using (new SpineInspectorUtility.IndentScope()) {
|
|
|
+ using (new EditorGUILayout.FadeGroupScope(showEventDataTree.faded)) {
|
|
|
+ if (skeleton.Data.Events.Count > 0) {
|
|
|
+ foreach (var e in skeleton.Data.Events) {
|
|
|
+ EditorGUILayout.LabelField(new GUIContent(e.Name, Icons.userEvent));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ EditorGUILayout.LabelField(NoneText);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (IsAnimating(showSlotsTree, showSkeleton, showConstraintsTree, showDrawOrderTree, showEventDataTree, showInspectBoneTree))
|
|
|
Repaint();
|
|
|
}
|
|
|
|
|
|
if (requireRepaint) {
|
|
|
skeletonRenderer.LateUpdate();
|
|
|
+ Repaint();
|
|
|
SceneView.RepaintAll();
|
|
|
}
|
|
|
+
|
|
|
+ EditorGUILayout.EndScrollView();
|
|
|
+ }
|
|
|
+
|
|
|
+ static bool IsAnimating (params AnimBool[] animBools) {
|
|
|
+ foreach (var a in animBools)
|
|
|
+ if (a.isAnimating) return true;
|
|
|
+ return false;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
void UpdateAttachments () {
|
|
|
- skeleton = skeletonRenderer.skeleton;
|
|
|
+ //skeleton = skeletonRenderer.skeleton;
|
|
|
Skin defaultSkin = skeleton.Data.DefaultSkin;
|
|
|
Skin skin = skeleton.Skin ?? defaultSkin;
|
|
|
bool notDefaultSkin = skin != defaultSkin;
|
|
@@ -294,8 +413,5 @@ namespace Spine.Unity.Editor {
|
|
|
|
|
|
activeSkin = skeleton.Skin;
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
}
|