大家好,我是阿赵,继续分享Unity编辑器界面扩展。
这一篇会举一些编辑器UI的具体例子,然后分享一下怎样使用Unity编辑器内置的资源和风格。
一、 自定义窗体综合小例子
之前一篇简单了介绍了怎样创建一个自定义的编辑器窗体,介绍了一些EditorWindow的基础知识,这里写一个小例子:
using UnityEditor;
using UnityEngine;
public class TestEditorWindow : EditorWindow
{
[MenuItem("Tools/TestWindow")]
private static void ShowTestWindow()
{
TestEditorWindow win = GetWindow<TestEditorWindow>();
win.titleContent = new GUIContent("测试窗体");
win.maxSize = win.minSize = new Vector2(500, 550);
}
private string[] platformList = new string[] {
"d_BuildSettings.Switch", "d_BuildSettings.PS5", "d_BuildSettings.XboxOne", "d_BuildSettings.Metro", "d_BuildSettings.iPhone", "d_BuildSettings.Android" };
private Vector2 platformScrollPos = new Vector2();
private int iconSize = 100;
private string filePathStr = "";
private string searchStr = "";
private Color selectedColor = Color.white;
private Object selectedObj;
private string[] popupStrs = new string[] {
"选项一","选项二","选项三","选项四" };
private int popupIndex = 0;
void OnGUI()
{
GUILayout.Box(EditorGUIUtility.IconContent("azhaoLogo"), GUILayout.Width(512), GUILayout.Height(128));
GUILayout.BeginHorizontal(EditorStyles.helpBox,GUILayout.Width(500));
GUILayout.Label("请选择文件路径:", EditorStyles.whiteLargeLabel, GUILayout.Width(100));
filePathStr = EditorGUILayout.TextField(filePathStr, GUILayout.Width(300), GUILayout.Height(30));
if (GUILayout.Button(EditorGUIUtility.IconContent("d_OpenedFolder Icon"), GUILayout.Width(40), GUILayout.Height(30)))
{
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
GUILayout.Label("请搜索:", EditorStyles.linkLabel, GUILayout.Width(100));
searchStr = EditorGUILayout.TextField(searchStr, EditorStyles.toolbarSearchField, GUILayout.Width(300));
GUILayout.EndHorizontal();
GUILayout.BeginVertical(EditorStyles.helpBox, GUILayout.Width(500));
EditorGUILayout.HelpBox("请问您习惯在哪个平台上玩游戏:",MessageType.Info);
platformScrollPos = GUILayout.BeginScrollView(platformScrollPos,GUILayout.Height(120));
GUILayout.BeginHorizontal();
for (int i = 0;i<platformList.Length;i++)
{
if(GUILayout.Button(EditorGUIUtility.IconContent(platformList[i]),GUILayout.Width(iconSize),GUILayout.Height(iconSize)))
{
//do something
}
}
GUILayout.EndHorizontal();
GUILayout.EndScrollView();
GUILayout.EndVertical();
EditorGUILayout.HelpBox("请不要说谎,我知道你在想什么", MessageType.Error);
GUILayout.BeginHorizontal();
GUILayout.Label("请选择物体:", EditorStyles.largeLabel, GUILayout.Width(100));
selectedObj = EditorGUILayout.ObjectField(selectedObj, typeof(Object), true, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.Space(10);
GUILayout.BeginHorizontal();
GUILayout.Label("请选择颜色:", EditorStyles.linkLabel, GUILayout.Width(100));
selectedColor = EditorGUILayout.ColorField(selectedColor, GUILayout.Width(200));
GUILayout.EndHorizontal();
GUILayout.Space(10);
GUILayout.BeginHorizontal();
GUILayout.Label("下拉列表:", GUILayout.Width(100));
popupIndex = EditorGUILayout.Popup(popupIndex, popupStrs, GUILayout.Width(200));
GUILayout.EndHorizontal();
}
}
运行窗体,会发现现在的窗体是这样的:

这个窗体比较简单,但里面用到了一些Unity编辑器扩展里面特有的东西,比如内置图标、自定义图片、编辑器UI风格和特殊组件。
二、 Unity内置图标
1、内置图标的使用
在上面的例子里面,出现了很多图标,比如各个游戏平台的图标、文件夹的图标和自定义的”阿赵Unity工具”的标题图片。这些图标是怎样调用的呢?
从代码上看,是通过了
EditorGUIUtility.IconContent
这个API来获得对应的图标图片的,传入图片的名字,不需要带扩展名,就可以获得相应的图片。
这个方法,是通过读取Assets/Editor Default Resources/Icons这个路径来获得对应的图片的。这个Editor Default Resources文件夹,在项目里面是看不到的,我们可以自己在Assets文件夹下面建立这个文件夹,然后把图片放到里面。比如我的那个”阿赵Unity工具”标题图片,就是放在这个文件夹里面的。

但有很多图片并不需要自己放到这个Assets/Editor Default Resources/Icons文件夹里面,也同样获取得到,比如平台图标"d_BuildSettings.Switch"或者文件夹图标"d_OpenedFolder Icon"。这是因为,Unity编辑器已经内置了一些可以使用的自带的图标,我们可以直接使用的。
2、 获取所有能用的内置图片名称
既然Unity有很多默认的图标可以使用,那我们怎么知道这些图标的名字呢?比如刚才说的"d_BuildSettings.Switch",是怎么知道的呢?
这里我做了个工具,可以获取所有的内置图标,并且点击的时候,会打印图标的名称并且复制到剪切板:

还可以搜索自己想要的关键词:

这些内置的资源是怎样获取的呢?
在网上很多人介绍,说通过Resrouces来获取,比如这样
Texture[] textures = Resources.FindObjectsOfTypeAll<Texture>();
这种方法可以获取一部分的图标,但很多图标是获取不到的,看看Resources.FindObjectsOfTypeAll的API说明:

这个方法只会获取Unity编辑器已经加载了

最低0.47元/天 解锁文章
7万+

被折叠的 条评论
为什么被折叠?



