概述
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
创作不易,如果觉得这篇文章对你有所帮助,可以动动小手,点个赞哈,ღ( ´・ᴗ・` )比心