在Unity中,美术如果没有时间给每一个预设体对象做对应的预设体图片,这种方式可以有效的节约美术的时间成本
生成的缩略图在UI效果要求不高的前提下,生成的图片可以直接使用的
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; } }