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

news2024/11/26 19:38:41

概述

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1160847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Express框架开发接口之req.params、req.query与req.body的区别

1.req.query 用于get请求 http://localhost:3000/user?usernameljz&age1 获取 URL 中携带的查询参数 通过req.query对象&#xff0c;可以访问到客户端通过查询字符串的形式&#xff0c;发送到服务器的参数&#xff1a; 2.req.params 用于get请求 url路径为&#xff…

Ubuntu MySQL客户端功能介绍(mysql-client)mysql命令(mysql客户端命令)数据库导出、数据库导入

文章目录 Ubuntu MySQL客户端(mysql-client)功能介绍MySQL客户端与服务端服务器端&#xff08;MySQL Server&#xff09;客户端&#xff08;MySQL Client&#xff09; 安装MySQL客户端连接到MySQL服务器&#xff08;mysql -h host -u user -p&#xff09;执行SQL查询批处理模式…

SpringCloud-Alibaba-Seata

SpringCloud-Alibaba-Seata 注意&#xff1a;最好使用JDK1.8&#xff0c;使用JDK17整合seata会出现一些问题&#xff01;&#xff01;&#xff01; Docker部署Seata1.5.2 1&#xff1a;拉取Seata1.5.2镜像&#xff1a; docker pull seataio/seata-server:1.5.22&#xff1a;在…

C/C++奇数求和 2021年3月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C奇数求和 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C奇数求和 2021年3月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 计算非负整数 m 到 n&#xff08;包括m 和 n &#xff…

驱动开发11-2 编写SPI驱动程序-点亮数码管

驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/spi/spi.h>int m74hc595_probe(struct spi_device *spi) {printk("%s:%d\n",__FILE__,__LINE__);char buf[]{0XF,0X6D};spi_write(spi,buf,sizeof(buf));return 0; …

HNU-数据库系统-讨论课1

第一次小班讨论课安排如下: 主题: 大数据管理及前沿技术讨论 目的&#xff1a;让学生了解大数据管理的相关理论、技术和系统。 内容: &#xff08;1&#xff09;大数据概念、应用、技术的相关知识。 &#xff08;2&#xff09;AI4DB &#xff08;3&#xff09;DB4AI &…

代码随想录打卡第五十八天|● 583. 两个字符串的删除操作 ● 72. 编辑距离

583. 两个字符串的删除操作 题目&#xff1a; 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 题目链接&#xff1a; 583. 两个字符串的删除操作 解题思路&#xff1a; dp数组的含义&am…

基于springboot漫画动漫网站

基于springbootvue漫画动漫网站 摘要 基于Spring Boot的漫画动漫网站是一个精彩的项目&#xff0c;它结合了现代Web开发技术和漫画爱好者的热情。这个网站的目标是为用户提供一个便捷的平台&#xff0c;让他们能够欣赏各种漫画和动漫作品&#xff0c;与其他爱好者分享他们的兴趣…

Linux启动故障排错

Linux启动过程 开机流程、模块管理-CSDN博客 Grub三个阶段 1st stage&#xff1a;执行Grub主程序。Grub安装在MBR。由于MBR太小&#xff0c;所以与配置文件分开放1.5 stage&#xff1a;识别不同的文件系统2nd stage&#xff1a;加载Grub配置文件 /boot/grub2/grub.cfg。配置…

wordpress上传限制2M修改为256M的两种方式

方式一&#xff1a;修改php.ini 上传文件限制大小主要是php的php.ini配置决定的&#xff0c;所以只要找到php的配置文件&#xff0c;并且修改里面的配置即可&#xff0c;linux查看php的版本和配置文件位置的命令&#xff1a; php -i | grep "Configuration File" 一…

PTA 函数题(C语言)-- 阶乘计算升级版

题目title&#xff1a; 阶乘计算升级版 题目作者&#xff1a; 陈越 浙江大学 本题要求实现一个打印非负整数阶乘的函数。 函数接口定义&#xff1a; void Print_Factorial ( const int N ); 其中N是用户传入的参数&#xff0c;其值不超过1000。如果N是非负整数&#…

操作系统:文件管理(一)文件系统基础

一战成硕 4.1 文件系统基础4.1.1 文件的基本概念4.1.2 文件控制块和索引结点4.1.3 文件的操作4.1.4 文件保护4.1.5 文件的逻辑结构4.1.6 文件的物理结构 4.1 文件系统基础 4.1.1 文件的基本概念 文件是以硬盘为载体的存储在计算机上的信息的结合。 在系统运行时&#xff0c;计…

用rust写web服务器笔记(11/1)

文章目录 一、创建一个具有监听链接功能web服务器二、读取请求内容三、编写web服务器返回网页(编写响应)四、编写web服务器有条件的返回网页五、编写多线程的web服务器六、用线程池实现web服务器七、实现线程池清除的web服务器八、读取文件 rust官网文档地址&#xff1a;https:…

传音影像团队图像超分辨领域的论文被国际计算机视觉顶级会议ICCV 2023录用

近日&#xff0c;国际计算机视觉大会 ICCV 2023&#xff08;International Conference on Computer Vision&#xff0c;简称ICCV&#xff09;在法国巴黎召开。传音影像团队与哈尔滨工业大学机器学习研究中心合作完成的图像超分辨领域的论文“MetaF2N: Blind Image Super-Resolu…

10个免费的设计素材网站分享,高效设计不是梦!

今天&#xff0c;我想和大家分享10个新的优秀设计资源网站&#xff0c;包括免费设计素材站、设计工具、字体等网站&#xff0c;特别是一些素材网站&#xff0c;都是免费下载的。而且相对来说&#xff0c;他们提供的设计素材的风格都是目前比较流行的&#xff0c;非常适合我们追…

Linux | 如何保持 SSH 会话处于活动状态

在远程服务器管理和安全数据传输中&#xff0c;SSH&#xff08;Secure Shell&#xff09;是不可或缺的工具。然而&#xff0c;它的便利性和安全性有时会因常见的问题而受到损害&#xff1a;冻结 SSH 会话。 此外&#xff0c;session 的突然中断可能会导致工作丢失、项目延迟和无…

uniapp开发小程序无法上传图片的解决方法

登录小程序后台&#xff0c;第一步菜单栏 设置 第二步&#xff0c;用户隐私保护 更新 第三步 选2 第四步 勾选需要的接口&#xff0c;并说明 等审核通过后&#xff0c;一会就能正常上传图片。

深度学习之基于YoloV5火灾烟雾报警系统(GUI界面)

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、火灾烟雾报警系统四. 总结 一项目简介 YoloV5 是深度学习中用于目标检测的一种算法&#xff0c;可以对输入的图像进行识别&#xff0c;标识出…

nodejs+vue+elementui+python家电销售分析系统设计与实现-计算机毕业设计

系统按照用户的实际需求开发而来&#xff0c;贴近生活。从管理员通过正确的账号的密码进入系统&#xff0c;可以使用相关的系统应用。管理员总体负责整体系统的运行维护&#xff0c;统筹协调。 我们可以利用计算机技术来取代传统的管理模式&#xff0c;实现家电销售分析系统的…

Linux--jdk,tomca,mysql安装、后端项目搭建

一、JDK和Tomcat的安装 1.JDK安装 直接上传到Linux服务器的&#xff0c;上传jdk、tomcat安装包 解压JDK安装包 //解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 置环境变量(JAVA_HOME和PATH) vim /etc/profile 在文件末尾添加以下内容&#xff1a; //java environment expo…