unity编辑器扩展一批量生成图片预制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity编辑器扩展一批量生成图片预制相关的知识,希望对你有一定的参考价值。

觉得自己正在慢慢退化,所以以后坚持写博客记录一下成长。

今天分享一个以前用到的一个功能,unity编辑器的一个扩张工具--批量生成图片,有兴趣的朋友可以进行扩展

闲话少说直接上代码:

namespace Game.Utility
{
    public class BatchCreatePrefab : EditorWindow
    {
        [MenuItem("Tools/生成预制")]
        private static void PrefabWrapTool()
        {
            GetWindow<BatchCreatePrefab>().Show();
        }

        private int m_index = 0;
        private static string[] s_outputDirectories;

        private void OnEnable()
        {
            Selection.selectionChanged += Repaint;
        }

        private void OnDisable()
        {
            Selection.selectionChanged -= Repaint;
        }

        /// <summary>
        /// 更新目录
        /// </summary>
        private void UpdateDirectory()
        {
            s_outputDirectories = Directory.GetDirectories("Assets\\Resources", "*", SearchOption.AllDirectories);
            System.Array.Sort(s_outputDirectories);
            Repaint();
        }
        private static string RemoveDirectory = "Assets";
        private void OnGUI()
        {
            if (s_outputDirectories == null)
            {
                UpdateDirectory();
            }
            EditorGUILayout.BeginHorizontal();
            float defaultLabelWidth = EditorGUIUtility.labelWidth;
            EditorGUIUtility.labelWidth = 60;
            EditorGUILayout.PrefixLabel("输出目录");
            m_index = EditorGUILayout.Popup(m_index, s_outputDirectories);
            EditorGUIUtility.labelWidth = defaultLabelWidth;
            if (GUILayout.Button("刷新", GUILayout.MaxWidth(40)))
            {
                UpdateDirectory();
            }
            EditorGUILayout.EndHorizontal();
            EditorGUILayout.BeginHorizontal();
            EditorGUIUtility.labelWidth = 100;
            EditorGUILayout.PrefixLabel("忽略层级目录:");
            RemoveDirectory = EditorGUILayout.TextField(RemoveDirectory);
            EditorGUILayout.EndHorizontal();

            EditorGUILayout.Space();
            int selectionCount = Selection.GetFiltered(typeof(Texture2D), SelectionMode.Assets).Length;
            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.Space();
            if (GUILayout.Button("生成(" + selectionCount + ")", GUILayout.Height(20), GUILayout.MaxWidth(100)))
            {
                CreateAllSelectionPrefab(s_outputDirectories[m_index]);
            }
            EditorGUILayout.EndHorizontal();
        }

        private static void CreateAllSelectionPrefab(string outputPath)
        {
            Object[] allSelectedTextuers = Selection.GetFiltered(typeof(Texture2D), SelectionMode.Assets);
            if (allSelectedTextuers.Length == 0)
            {
                Debug.LogWarning("未选中物体");
                return;
            }

            GameObject spriteObject = new GameObject();
            SpriteRenderer spriteRenderer = spriteObject.AddComponent<SpriteRenderer>();
            for (int i = 0; i < allSelectedTextuers.Length; i++)
            {
                string path = AssetDatabase.GetAssetPath(allSelectedTextuers[i]).Replace("/", "\\");
                string replaceString = path.Replace("/", "\\");
                if (!Directory.Exists(RemoveDirectory))
                {
                    Object.DestroyImmediate(spriteObject);
                    Debug.LogError("忽略层级目录错误");
                    return;
                }
                string replaceDirectory = replaceString.Replace(RemoveDirectory, null);//替换字符串
                int lastCharIndex = replaceDirectory.LastIndexOf("\\");//得到物体的下标
                string removeString = replaceDirectory.Remove(lastCharIndex, replaceDirectory.Length - lastCharIndex);
                string finalOutputPath = outputPath + removeString;
                Sprite sprite = AssetDatabase.LoadAssetAtPath<Sprite>(path);
                spriteRenderer.sprite = sprite;
                spriteObject.name = allSelectedTextuers[i].name;
                CreateSpritePrefab(spriteObject, finalOutputPath);
            }
            Object.DestroyImmediate(spriteObject);
            Debug.Log("生成成功");
        }

        private static void CreateSpritePrefab(GameObject spriteObject, string outputPath)
        {
            if (Directory.Exists(outputPath) == false)
            {
                Directory.CreateDirectory(outputPath);
                AssetDatabase.Refresh();
            }
            outputPath = outputPath.Replace("\\", "/");
            PrefabUtility.CreatePrefab(outputPath + "/" + spriteObject.name + ".prefab", spriteObject);
            AssetDatabase.Refresh();
        }

    }
}

以上是关于unity编辑器扩展一批量生成图片预制的主要内容,如果未能解决你的问题,请参考以下文章

Unity编辑器扩展——自动生成UI界面脚本

Unity编辑器扩展——PrefabUtility

Unity编辑器扩展——PrefabUtility

Unity插件扩展中组件常用的几个方法

Unity编辑器扩展: 程序化打图集工具

Unity编辑器扩展chapter1