Довольно простое окно, обеспечивающее быстрый просмотр стилей скинов во всех 8 состояниях.
Особенно полезно для просмотра больших скинов, например нативного скина Unity.
Для установки закиньте скрипт в Assets/Editor/GUISkinViewer.cs
Вызывается через меню Window/Supporting/GUISkinViewer.
Просто перетаскиваете на поле скин и смотрите.
using System; using System.Linq; using System.Reflection; using UnityEngine; namespace UnityEditor { public class GUISkinViewer : EditorWindow { [MenuItem("Window/Supporting/GUISkin Viewer")] public static void Create() { GetWindow<GUISkinViewer>(true, "GUISkin Viewer", true); } public GUISkin guiSkin; public Vector2 scrollPos; public int index = 0; public string find = ""; public GUIStyle[] showStyles; public void OnGUI() { var up = Event.current.type == EventType.keyDown && Event.current.keyCode == KeyCode.UpArrow; var down = Event.current.type == EventType.keyDown && Event.current.keyCode == KeyCode.DownArrow; GUILayout.BeginHorizontal(GUILayout.ExpandHeight(true)); { GUILayout.BeginVertical(GUILayout.Width(300)); { find = EditorGUILayout.TextField("Find: ", find); GUILayout.BeginHorizontal(); guiSkin = EditorGUILayout.ObjectField("GUISkin", guiSkin, typeof(GUISkin), false) as GUISkin; if (GUILayout.Button("...", "minibutton", GUILayout.ExpandWidth(false))) { var a = new GenericMenu(); a.AddItem(new GUIContent("LightSkin"), false, () => guiSkin = EditorGUIUtility.GetBuiltinSkin(EditorSkin.Inspector)); a.AddItem(new GUIContent("DarkSkin"), false, () => guiSkin = EditorGUIUtility.GetBuiltinSkin(EditorSkin.Scene)); a.ShowAsContext(); } GUILayout.EndHorizontal(); GUI.SetNextControlName("two"); if (guiSkin != null) { var styles = guiSkin.customStyles; showStyles = styles.Where(x => x.name.IndexOf(find, StringComparison.OrdinalIgnoreCase) != -1).ToArray(); scrollPos = GUILayout.BeginScrollView(scrollPos); var array = showStyles.ToList().Select(x => x.name).ToArray(); var command2 = new GUIStyle("CN EntryBackOdd") { margin = new RectOffset() }; index = GUILayout.SelectionGrid(Mathf.Clamp(index, 0, array.Length - 1), array, 1, command2); if (index >= showStyles.Length) index = 0; GUILayout.EndScrollView(); GUILayout.BeginHorizontal(); if (index >= 0 && index < showStyles.Length) { GUILayout.Label(showStyles[index].name); if (GUILayout.Button("copy")) EditorGUIUtility.systemCopyBuffer = showStyles[index].name; } GUILayout.EndHorizontal(); } } GUILayout.EndVertical(); GUILayout.BeginVertical(); if (guiSkin != null && showStyles.Length != 0) { GUILayout.BeginHorizontal(); { GUILayout.BeginVertical(GUILayout.ExpandWidth(true)); { DrawStyle(x => x.normal, "normal"); DrawStyle(x => x.hover, "hover"); DrawStyle(x => x.active, "active"); DrawStyle(x => x.focused, "focused"); } GUILayout.EndVertical(); if (GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) GUI.FocusControl("two"); GUILayout.BeginVertical(GUILayout.ExpandWidth(true)); { DrawStyle(x => x.onNormal, "onNormal"); DrawStyle(x => x.onHover, "onHover"); DrawStyle(x => x.onActive, "onActive"); DrawStyle(x => x.onFocused, "onFocused"); } GUILayout.EndVertical(); if (GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) GUI.FocusControl("two"); } GUILayout.EndHorizontal(); var methods = typeof(GUIStyle).GetMethods().Where(x => x.Name.StartsWith("get_") && x.ReturnType != typeof(GUIStyleState)).ToArray(); foreach (MethodInfo method in methods) GUILayout.Label(string.Format("<b>{0}</b>: {1}", method.Name.Substring(4), method.Invoke(showStyles[index], null)), new GUIStyle("label") { richText = true }); } GUILayout.EndVertical(); } GUILayout.EndHorizontal(); if (guiSkin == null) return; var e = Event.current; // if (e.type == EventType.KeyDown) { if (up) { index--; if (index < 0) index = 0; e.Use(); Repaint(); } if (down) { index++; if (index >= showStyles.Length) index = showStyles.Length - 1; e.Use(); Repaint(); } } } public void DrawStyle(Func<GUIStyle, GUIStyleState> state, string text) { if (guiSkin != null) { var style = new GUIStyle(showStyles[index]) { normal = state.Invoke(showStyles[index]) }; GUILayout.Box(text, style); } } } }
Смотрите также:
Комментарии
Так до конца и не разобрался, каким образом растягиваются текстуры в кастомных гуискинах.
RSQR, что ты имеешь ввиду под кастомными *гуискинами* и растяжением? Думаю я мог бы объяснить.
Ты наверное имел ввиду кастомные гуистили в гуискине.
Если ты про растяжение текстуры фона то там все очень просто - они растягиваются по дефолту.
Есть параметр border который отвечает сколько пикселей нужно отобразить в нормальном размере с каждой стороны. А все что остается как и прежде растянется.
Или ты хотел узнать что-то другое?
RSQR, что ты имеешь ввиду под кастомными *гуискинами* и растяжением? Думаю я мог бы объяснить.
Ты наверное имел ввиду кастомные гуистили в гуискине.Если ты про растяжение текстуры фона то там все очень просто - они растягиваются по дефолту.
Есть параметр border который отвечает сколько пикселей нужно отобразить в нормальном размере с каждой стороны. А все что остается как и прежде растянется.Или ты хотел узнать что-то другое?
Да, про это хотел узнать. Квадратная текстура растягивается непропорционально. Вот допустим у стандартного скина юнити текстура - круг, который растягивается в зависимости от элемента. Как растянуть текстуру без артефактов и какого размера текстура должна быть?
Обновил скрипт.
- Теперь отображает поля у стиля
- Позволяет выбрать Light/Dark скин редактора
- Немного изменился внешний вид списка слева на чуть менее убогий
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]