Добавлен Devion,
опубликован
Довольно простое окно, обеспечивающее быстрый просмотр стилей скинов во всех 8 состояниях.
Особенно полезно для просмотра больших скинов, например нативного скина Unity.
Для установки закиньте скрипт в Assets/Editor/GUISkinViewer.cs
Вызывается через меню Window/Supporting/GUISkinViewer.
Просто перетаскиваете на поле скин и смотрите.
Особенно полезно для просмотра больших скинов, например нативного скина 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);
}
}
}
}
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ты наверное имел ввиду кастомные гуистили в гуискине.
Есть параметр border который отвечает сколько пикселей нужно отобразить в нормальном размере с каждой стороны. А все что остается как и прежде растянется.
Отредактирован Devion