MenuItem属性可以把任意静态函数变成一个菜单命令,在Unity3D中仅静态函数能使用这个属性。
在创建菜单时,可以指定特定的字符来为菜单添加快捷键,如下所示:
字符%表示Windows上的ctrl键, OS X上的cmd键
字符#表示shift键
字符&表示alt键
字符_表示单键(非组合),例如_g,表示快捷键G。
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
public class ThumbnaiWindow : EditorWindow
{
private string outPath = "Assets/TestPrefab";
List<PrefabObj> m_ObjPath = new List<PrefabObj>();
[MenuItem("Tools/Thumbnais")]
public static void ShowWindow()
{
EditorWindow.GetWindow(typeof(ThumbnaiWindow));
Selection.selectionChanged = () =>
{
Debug.Log("change");
};
}
private Vector2 scrollTextureView = Vector2.zero;
void OnGUI()
{
scrollTextureView = GUILayout.BeginScrollView(scrollTextureView);
EditorGUILayout.BeginHorizontal();
GUILayout.Label("导出路径:");
outPath = GUILayout.TextField(outPath);
EditorGUILayout.EndHorizontal();
GUILayout.Label("加入对象:", EditorStyles.boldLabel);
for (int i = 0; i < m_ObjPath.Count; ++i)
{
EditorGUILayout.BeginHorizontal();
string assetPath = m_ObjPath[i].path;
var obj = AssetDatabase.LoadAssetAtPath<GameObject>(assetPath);
EditorGUI.BeginChangeCheck();
var newPrefab = EditorGUILayout.ObjectField(obj, typeof(GameObject), false);
if (EditorGUI.EndChangeCheck())
{
var newPath = AssetDatabase.GetAssetPath(newPrefab);
m_ObjPath[i].path = newPath;
m_ObjPath[i].name = newPrefab.name;
}
if (GUILayout.Button("删除"))
{
m_ObjPath.RemoveAt(i);
}
EditorGUILayout.EndHorizontal();
}
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("添加空物体"))
{
m_ObjPath.Add(new PrefabObj());
}
if (GUILayout.Button("添加所选对象"))
{
GameObject[] objs = Selection.gameObjects;
for (int j = 0; j < objs.Length; j++)
{
AddPrefabobj(objs[j]);
}
}
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
if (GUILayout.Button("导出缩略图"))
{
ExportThumbnail();
}
if (GUILayout.Button("清除所有配置"))
{
m_ObjPath.Clear();
}
EditorGUILayout.EndHorizontal();
GUILayout.EndScrollView();
}
//从配置导出缩略图
public void ExportThumbnail()
{
for (int i = 0; i < m_ObjPath.Count; i++)
{
GameObject obj = AssetDatabase.LoadAssetAtPath<GameObject>(m_ObjPath[i].path);
AssetPreview.SetPreviewTextureCacheSize(1024);
Texture2D tempTexture = AssetPreview.GetAssetPreview(obj);
if (tempTexture == null || !tempTexture.isReadable)
{
continue;
}
byte[] bytesThumbnail = tempTexture.EncodeToPNG();
if (!Directory.Exists(outPath))
{
Directory.CreateDirectory(outPath);
}
FileStream outputThumbnail =
new FileStream(outPath + "/" + Path.GetFileNameWithoutExtension(m_ObjPath[i].path) +"_Icon"+ ".png",
FileMode.Create);
outputThumbnail.Write(bytesThumbnail, 0, bytesThumbnail.Length);
outputThumbnail.Flush();
outputThumbnail.Close();
}
AssetDatabase.Refresh();
}
public void AddPrefabobj(GameObject obj)
{
string assetPath = AssetDatabase.GetAssetPath(obj);
PrefabObj prefabObj = new PrefabObj();
prefabObj.name = obj.name;
prefabObj.path = assetPath;
bool isContian = false;
for (int i = 0; i < m_ObjPath.Count; i++)
{
if (m_ObjPath[i].name == prefabObj.name)
isContian = true;
}
for (int i = 0; i < m_ObjPath.Count; i++)
{
if (m_ObjPath[i].name == null)
{
m_ObjPath.RemoveAt(i);
}
}
if(!isContian) m_ObjPath.Add(prefabObj);
}
public class PrefabObj
{
public string path;
public string name;
}
}