作Unity工具的时候,功能虽然很重要,但是美观也很重要。所以,用Unity内置自带的图标,会感觉更好看一点。
那么问题来了,你怎么得到Unity的内置图标呢?
雨松MOMO写过个博客,他反编译了一下editor的dll,用正则把图标信息给提取了出来。诶我【哔–】,我这菜【哔–】没看过反编译怎么办?【雨松MOMO:他的图标】
那其实也还有其他的方法。我们可以直接用 Resources 的 FindObjectsOfTypeAll 先看看。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class UnityIconsWindow : EditorWindow
{
[MenuItem(("JJJ/Unity Textures Window"))]
static void Init()
{
UnityIconsWindow window = EditorWindow.GetWindow<UnityIconsWindow>("Unity Textures Window");
window.textures = Resources.FindObjectsOfTypeAll<Texture2D>();
window.minSize = new Vector2(200, 400);
window.fullRect = new Rect();
foreach (var texture in window.textures)
{
window.fullRect.height += texture.height + 15 + 5 + 10;
}
}
Vector2 scrollPos;
Texture2D[] textures;
Rect fullRect;
void OnGUI()
{
Rect scrollrect = new Rect();
scrollrect.width = position.width;
scrollrect.height = position.height;
scrollPos = GUI.BeginScrollView(scrollrect, scrollPos, fullRect);
Rect r = new Rect();
r.x = 10;
Rect box = new Rect();
box.x = 7;
box.width = position.width - 30;
foreach (Texture2D texture in textures)
{
box.y = r.y;
box.height = 15 + 5 + texture.height + 2;
GUI.Box(box, "");
r.height = 15;
r.width = position.width;
GUI.Label(r, texture.name);
r.y += r.height;
r.y += 5;
r.height = texture.height;
r.width = texture.width;
GUI.DrawTexture(r, texture);
r.y += texture.height;
r.y += 10;
}
GUI.EndScrollView();
}
}
接下来,我们就可以看到很多见过的图标。 最好是在新建一个空项目里面,因为项目自己本身的Texture也会加载进来。
但是其中我发现了一些问题,有一些Texture 的 name字段是空? 诶卧【哔–】? 这也行吗?但是没关系,问题不大,我们不用这张图。
那现在我们看到了这些图片,怎么在我们的工具里用它们呢?这你总不能每次用它都加载,然后遍历,取名字一样的吧?
其实,Unity是有API通过名字获得具体的Icon,
public static GUIContent IconContent (string name, string text= null);
要创建 GUIContent 就直接这个API就好了,那如果只是要 Texture 呢?那也很简单,
Texture texture = EditorGUIUtility.IconContent("IconName").image;
|