GUISkinViewer - окно для просмотра стилей

» опубликован
» Категория: Редактор
» Язык: C#
Читай на DevTribe.ru!

Довольно простое окно, обеспечивающее быстрый просмотр стилей скинов во всех 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);
            }
        }
    }
}
» Старый вид. Для истории.


Просмотров: 1 958

RSQR #1 - 4 года назад 1
Так до конца и не разобрался, каким образом растягиваются текстуры в кастомных гуискинах.
Devion #2 - 4 года назад 1
RSQR, что ты имеешь ввиду под кастомными гуискинами и растяжением? Думаю я мог бы объяснить.
Ты наверное имел ввиду кастомные гуистили в гуискине.
Если ты про растяжение текстуры фона то там все очень просто - они растягиваются по дефолту.
Есть параметр border который отвечает сколько пикселей нужно отобразить в нормальном размере с каждой стороны. А все что остается как и прежде растянется.
Или ты хотел узнать что-то другое?
RSQR #3 - 4 года назад 0
Extravert:
RSQR, что ты имеешь ввиду под кастомными гуискинами и растяжением? Думаю я мог бы объяснить.
Ты наверное имел ввиду кастомные гуистили в гуискине.
Если ты про растяжение текстуры фона то там все очень просто - они растягиваются по дефолту.
Есть параметр border который отвечает сколько пикселей нужно отобразить в нормальном размере с каждой стороны. А все что остается как и прежде растянется.
Или ты хотел узнать что-то другое?
Да, про это хотел узнать. Квадратная текстура растягивается непропорционально. Вот допустим у стандартного скина юнити текстура - круг, который растягивается в зависимости от элемента. Как растянуть текстуру без артефактов и какого размера текстура должна быть?
Devion #4 - 3 года назад (отредактировано ) 0
Обновил скрипт.
  • Теперь отображает поля у стиля
  • Позволяет выбрать Light/Dark скин редактора
  • Немного изменился внешний вид списка слева на чуть менее убогий