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();}#endregionpublic 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 viewusing (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);// ButtonsGUILayout.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.hqwc.cn/news/156347.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11月的『备考学习计划』+高效的作息时间表 超好用~

每日作息时间表 每天有三个时间段学习效率高 上午10点左右 下午4点左右 晚上8点-10点左右 坚持住了&#xff0c;学习效果事半功倍 有同感的同学 可以举举手&#x1f91a;&#xff0c;点点赞&#x1f493; 每日作息时间表 6:30-7:00起床 6:30---7:00是起床的最佳时刻&am…

Redis Predixy 集群

文章目录 一、概述二、测试规划三、Redis 服务实例准备3.1 配置Redis实例3.2 创建相关资源3.2 启动Redis服务实例 四、Sentinel 监控准备4.1 配置 sentine l3.2 开启 Sentinel 五、安装配置 Predixy5.1 下载 Predixy5.2 配置 Predixy5.3 启动 Predixy 代理 六、测试 如果您对Re…

metaRTC集成flutter ui demo编译指南

概要 Flutter是由Google开发的开源UI工具包&#xff0c;用于构建跨平台应用程序&#xff0c;支持linux/windows/mac/android/ios等操作系统。 metaRTC新增flutter demo&#xff0c;支持linux/windows/mac/android/ios操作系统&#xff0c;此demo在ubuntu桌面环境下测试成功。…

传统金融机构加入代币化浪潮,新一轮加密周期的重要组成部分?

新加坡金融管理局 (MAS) 成立了由日本金融厅 (FSA)、英国金融行为监管局 (FCA) 和瑞士金融市场监管局 (FINMA) 组成“守护者计划”政策制定者组&#xff08;Project Guardian&#xff09;&#xff0c;正在计划对固定收益、外汇和资产管理产品进行资产代币化试点&#xff0c;以推…

pyhton socketserver

网上找到一段代码 关于 socketserver 的使用 本来想用C 和 libevent 写,libevent 对linux 支持的很好,macos 支持的也可以,但是windows 有点不太尽如人意,Qt 框架的 又得被迫开源一些东西,也很烦 先用python 写一个示例,先凑合着用 import socketserverclass MyServer(socketse…

激光雷达和人工智能

几十年来&#xff0c;激光雷达一直是许多行业中非常有用的工具&#xff0c;但直到最近&#xff0c;随着人工智能&#xff08;AI&#xff09;解决方案的引入&#xff0c;我们才开始认识到它的真正潜力。激光雷达&#xff0c;又称光探测和测距&#xff0c;是一种遥感技术。它利用…

@echo off 的作用

echo off 的作用 表示关闭批处理文件自身的回显&#xff0c;即执行此句之后的命令不会显示出来&#xff0c;只有输出结果会被显示 整体的理解就是 执行的命令不显示了&#xff0c;显示执行命令后的结果 其中&#xff0c; 表示关闭命令回显功能&#xff0c;即命令执行时不在…

高效处理异常值的算法:One-class SVM模型的自动化方案

一、引言 数据清洗和异常值处理在数据分析和机器学习任务中扮演着关键的角色。清洗数据可以提高数据质量&#xff0c;消除噪声和错误&#xff0c;从而确保后续分析和建模的准确性和可靠性。而异常值则可能对数据分析结果产生严重影响&#xff0c;导致误导性的结论和决策。因此&…

【JavaEE初阶】 认识文件与Java中操作文件

文章目录 &#x1f334;认识文件&#x1f6a9;树型结构组织和目录&#x1f6a9;文件路径&#xff08;Path&#xff09;&#x1f6a9;知识扩展 &#x1f38d;Java 中操作文件&#x1f6a9;File 概述&#x1f4cc;属性&#x1f4cc;构造方法&#x1f4cc;方法 &#x1f6a9;File使…

优思学院|RCA(根本原因分析)四大步骤

在现代的制造业或者甚至是商业环境中&#xff0c;问题和突发事件不可避免地出现。 为了有效地解决这些问题并防止它们再次发生&#xff0c;根本原因分析&#xff08;RCA&#xff09;成为了至关重要的工具。 RCA是一种系统性的方法&#xff0c;涉及数据采集、因果图、根本原因…

el-dropdown自定义样式,不影响其他组件

原来的样式: 修改后的样式: 给el-dropdown-menu添加类名dropdown-menu <el-dropdown-menu slot"dropdown" class"dropdown-menu"><router-link to"/user/profile"><el-dro…

Linu之VM及WindowsServer安装

# 1.操作系统 ## 1.1.什么是操作系统 操作系统&#xff08;Operating System&#xff0c;简称OS&#xff09;是一种系统软件&#xff0c;它是计算机硬件和应用软件之间的桥梁。它管理计算机的硬件和软件资源&#xff0c;为应用程序提供接口和服务&#xff0c;并协调应用程序的…