三国卡牌客户端基础资源仓库
yyl
4 天以前 cec146fc3fe287928e075c79ece20a20a9b16b20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/******************************************************************************
 * Spine Runtimes License Agreement
 * Last updated July 28, 2023. Replaces all prior versions.
 *
 * Copyright (c) 2013-2023, Esoteric Software LLC
 *
 * Integration of the Spine Runtimes into software or otherwise creating
 * derivative works of the Spine Runtimes is permitted under the terms and
 * conditions of Section 2 of the Spine Editor License Agreement:
 * http://esotericsoftware.com/spine-editor-license
 *
 * Otherwise, it is permitted to integrate the Spine Runtimes into software or
 * otherwise create derivative works of the Spine Runtimes (collectively,
 * "Products"), provided that each user of the Products must obtain their own
 * Spine Editor license and redistribution of the Products in any form must
 * include this license and copyright notice.
 *
 * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
 * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THE
 * SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *****************************************************************************/
 
#if UNITY_2018_3 || UNITY_2019 || UNITY_2018_3_OR_NEWER
#define NEW_PREFAB_SYSTEM
#endif
 
#if UNITY_2021_2_OR_NEWER
#define PUBLIC_SET_ICON_FOR_OBJECT
#endif
 
using System.Reflection;
using UnityEditor;
using UnityEngine;
 
namespace Spine.Unity.Editor {
    using Icons = SpineEditorUtilities.Icons;
 
    [CustomEditor(typeof(SkeletonUtility))]
    public class SkeletonUtilityInspector : UnityEditor.Editor {
 
        SkeletonUtility skeletonUtility;
        Skeleton skeleton;
        SkeletonRenderer skeletonRenderer;
        SkeletonGraphic skeletonGraphic;
 
#if !NEW_PREFAB_SYSTEM
        bool isPrefab;
#endif
 
        readonly GUIContent SpawnHierarchyButtonLabel = new GUIContent("Spawn Hierarchy", Icons.skeleton);
 
        void OnEnable () {
            skeletonUtility = (SkeletonUtility)target;
            skeletonRenderer = skeletonUtility.skeletonRenderer;
            skeletonGraphic = skeletonUtility.skeletonGraphic;
            skeleton = skeletonUtility.Skeleton;
 
            if (skeleton == null) {
                if (skeletonRenderer != null) {
                    skeletonRenderer.Initialize(false);
                    skeletonRenderer.LateUpdate();
                } else if (skeletonGraphic != null) {
                    skeletonGraphic.Initialize(false);
                    skeletonGraphic.LateUpdate();
                }
                skeleton = skeletonUtility.Skeleton;
            }
 
            if ((skeletonRenderer != null && !skeletonRenderer.valid) ||
                (skeletonGraphic != null && !skeletonGraphic.IsValid)) return;
 
#if !NEW_PREFAB_SYSTEM
            isPrefab |= PrefabUtility.GetPrefabType(this.target) == PrefabType.Prefab;
#endif
        }
 
        public override void OnInspectorGUI () {
 
#if !NEW_PREFAB_SYSTEM
            if (isPrefab) {
                GUILayout.Label(new GUIContent("Cannot edit Prefabs", Icons.warning));
                return;
            }
#endif
 
            serializedObject.Update();
 
            if ((skeletonRenderer != null && !skeletonRenderer.valid) ||
                (skeletonGraphic != null && !skeletonGraphic.IsValid)) {
                GUILayout.Label(new GUIContent("Spine Component invalid. Check SkeletonData asset.", Icons.warning));
                return;
            }
 
            EditorGUILayout.PropertyField(serializedObject.FindProperty("boneRoot"), SpineInspectorUtility.TempContent("Skeleton Root"));
            EditorGUILayout.PropertyField(serializedObject.FindProperty("flipBy180DegreeRotation"), SpineInspectorUtility.TempContent("Flip by Rotation", null,
                "If true, Skeleton.ScaleX and Skeleton.ScaleY are followed " +
                "by 180 degree rotation. If false, negative Transform scale is used. " +
                "Note that using negative scale is consistent with previous behaviour (hence the default), " +
                "however causes serious problems with rigidbodies and physics. Therefore, it is recommended to " +
                "enable this parameter where possible. When creating hinge chains for a chain of skeleton bones " +
                "via SkeletonUtilityBone, it is mandatory to have this parameter enabled."));
 
            bool hasRootBone = skeletonUtility.boneRoot != null;
 
            if (!hasRootBone)
                EditorGUILayout.HelpBox("No hierarchy found. Use Spawn Hierarchy to generate GameObjects for bones.", MessageType.Info);
 
            using (new EditorGUI.DisabledGroupScope(hasRootBone)) {
                if (SpineInspectorUtility.LargeCenteredButton(SpawnHierarchyButtonLabel))
                    SpawnHierarchyContextMenu();
            }
 
            if (hasRootBone) {
                if (SpineInspectorUtility.CenteredButton(new GUIContent("Remove Hierarchy"))) {
                    Undo.RegisterCompleteObjectUndo(skeletonUtility, "Remove Hierarchy");
                    Undo.DestroyObjectImmediate(skeletonUtility.boneRoot.gameObject);
                    skeletonUtility.boneRoot = null;
                }
            }
 
            serializedObject.ApplyModifiedProperties();
        }
 
        void SpawnHierarchyContextMenu () {
            GenericMenu menu = new GenericMenu();
 
            menu.AddItem(new GUIContent("Follow all bones"), false, SpawnFollowHierarchy);
            menu.AddItem(new GUIContent("Follow (Root Only)"), false, SpawnFollowHierarchyRootOnly);
            menu.AddSeparator("");
            menu.AddItem(new GUIContent("Override all bones"), false, SpawnOverrideHierarchy);
            menu.AddItem(new GUIContent("Override (Root Only)"), false, SpawnOverrideHierarchyRootOnly);
 
            menu.ShowAsContext();
        }
 
        public static void AttachIcon (SkeletonUtilityBone boneComponent) {
            Skeleton skeleton = boneComponent.hierarchy.Skeleton;
            Texture2D icon = boneComponent.bone.Data.Length == 0 ? Icons.nullBone : Icons.boneNib;
 
            foreach (IkConstraint c in skeleton.IkConstraints)
                if (c.Target == boneComponent.bone) {
                    icon = Icons.constraintNib;
                    break;
                }
#if PUBLIC_SET_ICON_FOR_OBJECT
            EditorGUIUtility.SetIconForObject(boneComponent.gameObject, icon);
#else
            typeof(EditorGUIUtility).InvokeMember("SetIconForObject", BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.NonPublic, null, null, new object[2] {
                boneComponent.gameObject,
                icon
            });
#endif
        }
 
        static void AttachIconsToChildren (Transform root) {
            if (root != null) {
                SkeletonUtilityBone[] utilityBones = root.GetComponentsInChildren<SkeletonUtilityBone>();
                foreach (SkeletonUtilityBone utilBone in utilityBones)
                    AttachIcon(utilBone);
            }
        }
 
        void SpawnFollowHierarchy () {
            Undo.RegisterCompleteObjectUndo(skeletonUtility, "Spawn Hierarchy");
            Selection.activeGameObject = skeletonUtility.SpawnHierarchy(SkeletonUtilityBone.Mode.Follow, true, true, true);
            AttachIconsToChildren(skeletonUtility.boneRoot);
        }
 
        void SpawnFollowHierarchyRootOnly () {
            Undo.RegisterCompleteObjectUndo(skeletonUtility, "Spawn Root");
            Selection.activeGameObject = skeletonUtility.SpawnRoot(SkeletonUtilityBone.Mode.Follow, true, true, true);
            AttachIconsToChildren(skeletonUtility.boneRoot);
        }
 
        void SpawnOverrideHierarchy () {
            Undo.RegisterCompleteObjectUndo(skeletonUtility, "Spawn Hierarchy");
            Selection.activeGameObject = skeletonUtility.SpawnHierarchy(SkeletonUtilityBone.Mode.Override, true, true, true);
            AttachIconsToChildren(skeletonUtility.boneRoot);
        }
 
        void SpawnOverrideHierarchyRootOnly () {
            Undo.RegisterCompleteObjectUndo(skeletonUtility, "Spawn Root");
            Selection.activeGameObject = skeletonUtility.SpawnRoot(SkeletonUtilityBone.Mode.Override, true, true, true);
            AttachIconsToChildren(skeletonUtility.boneRoot);
        }
    }
 
}