Unity Editor工具,导出unitypackage可选择是否包含脚本

概述

Unity自带的Export Package...功能,如果选中资源中包含脚本,或者Prefab挂载了自定义的脚本。在之后弹出的选择框内,如果勾选了Include dependencies会将整个项目所有的脚本全部都包含在内。等于导入了很多不相关的代码。如果取消勾选Include dependencies,又只有选中的那个资源,其他引用到的资源又不包含在内。

但是在实际的工作中导出资源时,只想导出跟选中资源相关的资源,并不想包含脚本,或者仅包含该prefab挂载的脚本。这时候就需要自己编写一个Editor工具实现该功能。具体的代码如下

工具代码

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;
using System.IO;


public class AssetSelectPopUpWindow : EditorWindow
{
    private Vector2 scrollPosition;
    private List<string> items = null;
    //是否导出脚本
    public static bool exportWithScript = false;
    private bool[] selectionStates;


    #region editor菜单相关


    [MenuItem("Assets/Tools/导出Unity资源包")]
    public static void ExportWithoutScript()
    {
        exportWithScript = false;
        ShowWindow();
    }


    [MenuItem("Assets/Tools/导出Unity资源包(包含脚本)")]
    public static void ExportWithScript()
    {
        exportWithScript = true;
        ShowWindow();
    }

    public static void ShowWindow()
    {
        AssetSelectPopUpWindow wnd = GetWindow<AssetSelectPopUpWindow>();
        wnd.titleContent = new GUIContent("资源导出");
        wnd.minSize = new Vector2(450, 200);
        wnd.maxSize = new Vector2(1920, 720);
        wnd.Show();
    }
    #endregion



 
    public void GetAllFiles(bool withScript)
    {
        //获取鼠标选中的所有文件
        Object[] selectedObjects = Selection.GetFiltered<Object>(SelectionMode.Assets);
        List<string> assetPathNames = new List<string>();
        for (int i = 0; i < selectedObjects.Length; i++)
        {
            string directoryPath = AssetDatabase.GetAssetPath(selectedObjects[i]);
            if (directoryPath != null)
            {
                //如果是文件夹,就遍历文件夹下的所有资源
                if (Directory.Exists(directoryPath))
                {
                    string[] folders = Directory.GetFiles(directoryPath);
                    for (int j = 0; j < folders.Length; j++)
                    {
                        //过滤掉.meta文件
                        if (!folders[j].EndsWith(".meta"))
                        {
                            assetPathNames.Add(folders[j]);
                        }
                    }
                }
                else
                {
                    assetPathNames.Add(directoryPath);
                }
            }
        }

        items = new List<string>();

        for (int i = 0; i < assetPathNames.Count; i++)
        {
            var depends = AssetDatabase.GetDependencies(assetPathNames[i], true);
            for (int j = 0; j < depends.Length; j++)
            {
                AddFiles(withScript, depends[j]);
            }
        }


        items.Sort();
        selectionStates = new bool[items.Count];
        //默认全选 
        SelectAllItems();

    }


    private void OnEnable()
    {
        GetAllFiles(exportWithScript);
    }

    //打印所有选择的文件
    private void ShowFiles()
    {
        for (int i = 0; i < items.Count; i++)
        {
            Debug.Log($"all Files is {items[i]}");
        }
    }
    private void AddFiles(bool withScript, string filePath)
    {
        //特定的目录不处理
        if (filePath.StartsWith("Packages/"))
        {
            return;
        }
        if (withScript || !filePath.EndsWith(".cs"))
        {
            if (!items.Contains(filePath))
            {
                items.Add(filePath);
            }
        }
    }
    private void OnGUI()
    {
        EditorGUILayout.Space(10);

        // Scroll view
        using (var scrollView = new EditorGUILayout.ScrollViewScope(scrollPosition))
        {
            scrollPosition = scrollView.scrollPosition;

            for (int i = 0; i < items.Count; i++)
            {
                selectionStates[i] = EditorGUILayout.ToggleLeft(items[i], selectionStates[i]);
            }
        }

        GUILayout.Space(10);

        // Buttons
        GUILayout.BeginHorizontal();
        if (GUILayout.Button("全选"))
        {
            SelectAllItems();
        }
        if (GUILayout.Button("全不选"))
        {
            DeselectAllItems();
        }
        GUILayout.EndHorizontal();

        GUILayout.Space(10);

        if (GUILayout.Button("导出"))
        {
            OutputSelectedItems();
          
        }
    }
    #region 按钮事件
    private void SelectAllItems()
    {
        for (int i = 0; i < selectionStates.Length; i++)
        {
            selectionStates[i] = true;
        }
    }

    private void DeselectAllItems()
    {
        for (int i = 0; i < selectionStates.Length; i++)
        {
            selectionStates[i] = false;
        }
    }

    private void OutputSelectedItems()
    {
        List<string> exportItems = new List<string>();    
        for (int i = 0; i < items.Count; i++)
        {
            if (selectionStates[i])
            {
                exportItems.Add(items[i]);
            }
        }
        if(exportItems.Count == 0)
        {
            EditorUtility.DisplayDialog("没有任何选中的资源", "请选择想要导出的资源", "OK");
            return;
        }
        var path = EditorUtility.SaveFilePanel("导出资源包", "", "", "unitypackage");
        if (path == "")
            return;

        var flag = ExportPackageOptions.Interactive | ExportPackageOptions.Recurse;
        //如果选择完后还想导出该资源关联的资源可以添加ExportPackageOptions.IncludeDependencies的Flag
        //if (exportWithScript)
        //{
        //    flag = flag | ExportPackageOptions.IncludeDependencies;
        //}
        AssetDatabase.ExportPackage(exportItems.ToArray(), path, flag);
        Close();

    }
    #endregion



}

示例

首先随便创建一个prefab,并且给prefab创建一些动画机,修改材质,并且挂载一个自定义的脚本

之后右键Cube.prefab使用unity自带的 Export Package...

如果勾选了Include dependencies,可以看到unity会将所有的脚本都包含在内,如下图所示

然而实际上跟这个Cube.prefab相关的资源只有下面这些

如果取消勾选Include dependencies,又只包含了这个prefab,相关的材质动画等资源全部没有包含在内

这时候改用我们自定义的AssetSelectPopUpWindow的导出功能,右键Cube.prefab,在弹出的菜单选择"Tools/导出Unity资源包”

可以看到实际包含的就只有跟prefab相关的资源

如果选择"导出Unity资源包(包含脚本)",会将Cube上包含的TestBehaviour也加入到列表内

列表内确认需要的资源后点击底部的导出按钮,即可导出package

参考文档

Editor界面编写:https://docs.unity.cn/Manual/UIE-HowTo-CreateEditorWindow.html

创作不易,如果觉得这篇文章对你有所帮助,可以动动小手,点个赞哈,ღ( ´・ᴗ・` )比心

猜你喜欢

转载自blog.csdn.net/shaobing32/article/details/134164487
今日推荐