前几天由于工作用到就研究了下批处理操作Unity编辑器进行fbx模型的打包工作,网上也没有可参考的文章,在开发的时候饶了不少弯,就记一下。
首先看要实现的效果,由于要给基本不懂的Unity编辑器的小白或者美工使用,所以确定了要做的是一个功能封装非常完备的傻瓜式工具。那么这个工具应该有的操作过程是打开批处理文件-->选择模型目录-->选择输出目录-->完成打包
。映射到开发部分,还要考虑到使用者是不会进行导入程序包的,所以需要实现的具体功能为创建批处理文件-->后台调用Unity编辑器-->新建Unity项目-->导入程序包-->调用打包函数-->选择模型目录-->选择输出目录-->打包完成-->退出Unity-->退出工具,清理缓存
。
开发过程
首先在Unity编辑器里面实现打包程序,然后封装好一个接口,导出程序包,经过批处理方法调用实现功能。
Unity程序包开发
创建程序接口1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class BuildAssetbundle : EditorWindow{//要创建路径选择窗口,需继承类EditorWindow
/// <summary>
/// 资源路径
/// </summary>
private static string assetPath;
/// <summary>
/// 导出路径
/// </summary>
private static string targetPath;
/// <summary>
/// 缓存路径
/// </summary>
private static string catchPath;
[//方便在Unity里面测试,编辑器扩展函数 ]
public static void StartBuild(){//接口方法
}
}
选择资源(fbx模型)路径1
2
3
4
5
6
7
8
9/// <summary>
/// 选择资源路径
/// </summary>
public static void GetAssetPath()
{
Debug.Log("开始选择资源路径");
GetWindow<BuildAssetbundle>(true, "打包工具");
assetPath = EditorUtility.OpenFolderPanel("选择资源路径", "", "");
}
创建缓冲文件夹1
2
3
4
5
6
7
8
9
10/// <summary>
/// 创建缓存文件夹
/// </summary>
public static void CreatCatchDir()
{
Debug.Log("开始创建缓冲文件夹");
catchPath = Application.dataPath + "/Resources/Model";
if (!Directory.Exists(catchPath))
Directory.CreateDirectory(catchPath);
}
将资源文件夹里面的模型复制到缓冲文件夹里1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28/// <summary>
/// 复制文件到Unity
/// </summary>
/// <param name="sourcePath">要复制的源文件夹</param>
/// <param name="targetPath">要复制到的目的文件夹</param>
public static void Copy(string sourcePath, string targetPath)
{
Debug.Log("开始复制文件");
DirectoryInfo info = new DirectoryInfo(sourcePath);
foreach (DirectoryInfo directory in info.GetDirectories())
{
if (!Directory.Exists(targetPath + "/" + directory.Name))
Directory.CreateDirectory(targetPath + "/" + directory.Name);
foreach (FileInfo file in directory.GetFiles())
{
if (!File.Exists(targetPath + "/" + directory.Name + "/" + file.Name))
File.Copy(sourcePath + "/" + directory.Name + "/" + file.Name, targetPath + "/" + directory.Name + "/" + file.Name);
}
}
foreach (FileInfo file in info.GetFiles())
{
if (!File.Exists(targetPath + "/" + file.Name))
File.Copy(sourcePath + "/" + file.Name, targetPath + "/" + file.Name);
}
AssetDatabase.Refresh();
}
选择模型文件并设置相应Assetname1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18/// <summary>
/// 选取Fbx文件,并设置assetname
/// </summary>
public static void SelectFbx()
{
Debug.Log("选取Fbx文件");
DirectoryInfo info = new DirectoryInfo(catchPath);
foreach (FileInfo file in info.GetFiles())
if (file.Extension.ToUpper() == ".FBX")
{
string importerPath = file.FullName.Replace("\\", "/");
string _assetPath = "Assets" + importerPath.Substring(Application.dataPath.Length);
AssetImporter importer = AssetImporter.GetAtPath(_assetPath);
importer.SetAssetBundleNameAndVariant(file.Name.Replace(".FBX", ""), "Asset");
importer.SaveAndReimport();
}
}
选择输出路径1
2
3
4
5
6
7
8
9/// <summary>
/// 选择导出路径
/// </summary>
public static void GetTargetPath()
{
Debug.Log("开始选择导出路径");
GetWindow<BuildAssetbundle>(true, "打包工具");
targetPath = EditorUtility.OpenFolderPanel("选择导出路径", "", "");
}
开始打包并删除缓存文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/// <summary>
/// 打包程序
/// </summary>
/// <param name="targetPath">打包文件存放目标位置</param>
public static void Build(string targetPath)
{
Debug.Log("开始打包");
if (BuildPipeline.BuildAssetBundles(targetPath, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows))
Debug.Log("资源打包成功");
Delete();
AssetDatabase.Refresh();
}
/// <summary>
/// 删除缓存中继文件
/// </summary>
public static void Delete()
{
DirectoryInfo info = new DirectoryInfo(Application.dataPath + "/Resources/");
info.Delete(true);
}
至此,整个打包类实现完毕,把这个cs文件放到Editor文件夹下,试验一下,没有问题。 将整个Editor文件夹打包成为UnityPackage
批处理工具开发
Unity支持批处理方式或者控制台方式调用,具体方法可见官方文档。1
2
3
4
5
6
7
8
9
10rem 打包工具
@echo off
echo 启动Unity.exe 请稍等
echo 开始打包...
start/min/wait C:\Users\UnityEditor2017.3.1p1\Unity\Editor\Unity.exe -quit -batchmode -logFile unity_log.txt -createProject D:\BuildAssetbundle -importPackage %cd%\BuildAssetbundle.unitypackage
echo 执行操作...
C:\Users\UnityEditor2017.3.1p1\Unity\Editor\Unity.exe -quit -projectPath D:\BuildAssetbundle -executeMethod BuildAssetbundle.StartBuild
rd/s/q D:\BuildAssetbundle
echo 打包完成,按任意键退出...
Pause
在这里只说下使用的批处理函数,-quit
是在运行了所有Unity操作后退出Unity,-batchmode
是使用批处理方式运行Unity,不显示编辑器界面后台运行,-logFile
是日志输出文件,-createProject
是创建一个新的Unity项目,-importPackage
是导入指定的unitypackage并且不显示界面,-executeMethod
是批处理或者控制台模式调用一个方法,要求这个方法的类不能为static
,并且方法必须为static
.这些方法都可以在Unity官方文档上见到说明:https://docs.unity3d.com/Manual/CommandLineArguments.html.
我把整个工具包放在了我的Github上,网址是:https://github.com/Liqiufan/BatchBuildAssetbundle.