2022-03-03 18:08:32 +08:00
|
|
|
|
# 资源构建
|
|
|
|
|
|
2022-09-06 14:49:26 +08:00
|
|
|
|
![image](./Image/AssetBuilder-img1.png)
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
|
|
|
|
### 界面介绍
|
|
|
|
|
|
2022-03-03 19:33:36 +08:00
|
|
|
|
- **Build Output**
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
2022-03-03 19:33:36 +08:00
|
|
|
|
构建输出的目录,会根据Unity编辑器当前切换的平台自动划分构建结果。
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
2022-07-18 11:25:09 +08:00
|
|
|
|
- **Build Pipeline**
|
|
|
|
|
|
|
|
|
|
构建管线
|
|
|
|
|
|
|
|
|
|
(1) BuiltinBuildPipeline: 传统的内置构建管线。
|
|
|
|
|
|
|
|
|
|
(2) ScriptableBuildPipeline: 可编程构建管线。
|
|
|
|
|
|
2022-05-04 00:12:06 +08:00
|
|
|
|
- **Build Mode**
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
2022-05-12 12:37:48 +08:00
|
|
|
|
构建模式
|
|
|
|
|
|
|
|
|
|
(1) 强制构建模式:会删除指定构建平台下的所有构建记录,重新构建所有资源包。
|
|
|
|
|
|
|
|
|
|
(2) 增量构建模式:以上一次构建结果为基础,对于发生变化的资源进行增量构建。
|
|
|
|
|
|
|
|
|
|
(3) 演练构建模式:在不生成AssetBundle文件的前提下,进行演练构建并快速生成构建报告和补丁清单。
|
|
|
|
|
|
|
|
|
|
(4) 模拟构建模式:在编辑器下配合EditorSimulateMode运行模式,来模拟真实运行的环境。
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
2022-10-08 16:25:36 +08:00
|
|
|
|
- **Build Package**
|
|
|
|
|
|
|
|
|
|
需要构建的资源包名称。
|
|
|
|
|
|
2022-04-04 22:44:13 +08:00
|
|
|
|
- **Encryption**
|
2022-03-23 18:24:12 +08:00
|
|
|
|
|
2022-04-04 22:44:13 +08:00
|
|
|
|
加密类列表。
|
2022-03-23 18:24:12 +08:00
|
|
|
|
|
2022-05-04 00:12:06 +08:00
|
|
|
|
- **Compression**
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
2022-05-04 00:12:06 +08:00
|
|
|
|
资源包的压缩方式。
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
2022-07-25 18:36:41 +08:00
|
|
|
|
- **Output Name Style**
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
2022-07-25 18:36:41 +08:00
|
|
|
|
输出的资源包文件名称样式
|
|
|
|
|
|
|
|
|
|
(1) HashName:哈希值
|
|
|
|
|
|
|
|
|
|
(2) HashName_Extension:哈希值+后缀名
|
|
|
|
|
|
|
|
|
|
(3) BundleName_HashName:资源包名+哈希值
|
|
|
|
|
|
|
|
|
|
(4) BundleName_HashName_Extension:资源包名+哈希值+后缀名
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
2022-10-18 19:27:47 +08:00
|
|
|
|
- **Copy Buildin File Option**
|
|
|
|
|
|
|
|
|
|
首包资源文件的拷贝方式
|
|
|
|
|
|
|
|
|
|
(1) None:不拷贝任何文件
|
|
|
|
|
|
|
|
|
|
(2) ClearAndCopyAll:先清空已有文件,然后拷贝所有文件
|
|
|
|
|
|
|
|
|
|
(3) ClearAndCopyByTags:先清空已有文件,然后按照资源标签拷贝文件
|
|
|
|
|
|
|
|
|
|
(4) OnlyCopyAll:不清空已有文件,直接拷贝所有文件
|
|
|
|
|
|
|
|
|
|
(5) OnlyCopyByTags:不清空已有文件,直接按照资源标签拷贝文件
|
|
|
|
|
|
2022-04-04 22:44:13 +08:00
|
|
|
|
- **构建**
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
2022-04-04 22:44:13 +08:00
|
|
|
|
点击构建按钮会开始构建流程,构建流程分为多个节点顺序执行,如果某个节点发生错误,会导致构建失败。错误信息可以在控制台查看。
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
|
|
|
|
### 资源包加密
|
|
|
|
|
|
2022-03-23 23:08:39 +08:00
|
|
|
|
编写继承IEncryptionServices接口的加密类。注意:加密类文件需要放置在Editor文件夹里。
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
|
|
|
|
````C#
|
2022-03-23 18:24:12 +08:00
|
|
|
|
using System;
|
2022-03-21 23:49:50 +08:00
|
|
|
|
using YooAsset.Editor;
|
|
|
|
|
|
2022-03-23 18:24:12 +08:00
|
|
|
|
public class GameEncryption : IEncryptionServices
|
2022-03-03 18:08:32 +08:00
|
|
|
|
{
|
2022-03-03 19:13:07 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// 检测资源包是否需要加密
|
|
|
|
|
/// </summary>
|
2022-04-04 22:44:13 +08:00
|
|
|
|
bool IEncryptionServices.Check(string bundleName)
|
2022-03-03 19:13:07 +08:00
|
|
|
|
{
|
|
|
|
|
// 对配置表相关的资源包进行加密
|
2022-04-04 22:44:13 +08:00
|
|
|
|
return bundleName.Contains("assets/config/");
|
2022-03-03 19:13:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 对数据进行加密,并返回加密后的数据
|
|
|
|
|
/// </summary>
|
2022-03-23 18:24:12 +08:00
|
|
|
|
byte[] IEncryptionServices.Encrypt(byte[] fileData)
|
2022-03-03 19:13:07 +08:00
|
|
|
|
{
|
|
|
|
|
int offset = 32;
|
|
|
|
|
var temper = new byte[fileData.Length + offset];
|
|
|
|
|
Buffer.BlockCopy(fileData, 0, temper, offset, fileData.Length);
|
|
|
|
|
return temper;
|
|
|
|
|
}
|
2022-03-03 18:08:32 +08:00
|
|
|
|
}
|
|
|
|
|
````
|
|
|
|
|
|
|
|
|
|
### 补丁包
|
|
|
|
|
|
|
|
|
|
构建成功后会在输出目录下找到补丁包文件夹,该文件夹名称为本次构建时指定的资源版本号。
|
|
|
|
|
|
2022-03-23 18:24:12 +08:00
|
|
|
|
补丁包文件夹里包含补丁清单文件,资源包文件,构建报告文件等。
|
|
|
|
|
|
2022-09-06 14:49:26 +08:00
|
|
|
|
![image](./Image/AssetBuilder-img4.png)
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
|
|
|
|
### 补丁清单
|
|
|
|
|
|
2022-10-28 10:46:35 +08:00
|
|
|
|
补丁清单是一个Json格式的文本文件。
|
|
|
|
|
|
|
|
|
|
AssetList组记录的是主资源对象列表。
|
|
|
|
|
|
|
|
|
|
BundleList组记录的是资源包列表。
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
2022-09-06 14:49:26 +08:00
|
|
|
|
![image](./Image/AssetBuilder-img2.png)
|
2022-03-03 18:08:32 +08:00
|
|
|
|
|
|
|
|
|
### Jenkins支持
|
|
|
|
|
|
|
|
|
|
如果需要自动化构建,可以参考如下代码范例:
|
|
|
|
|
|
2022-07-19 16:30:18 +08:00
|
|
|
|
使用内置构建管线来构建资源包。
|
|
|
|
|
|
2022-03-03 18:08:32 +08:00
|
|
|
|
````c#
|
|
|
|
|
private static void BuildInternal(BuildTarget buildTarget)
|
|
|
|
|
{
|
2022-03-03 19:13:07 +08:00
|
|
|
|
Debug.Log($"开始构建 : {buildTarget}");
|
|
|
|
|
|
|
|
|
|
// 构建参数
|
|
|
|
|
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
|
2022-07-19 16:30:18 +08:00
|
|
|
|
BuildParameters buildParameters = new BuildParameters();
|
2022-03-03 19:13:07 +08:00
|
|
|
|
buildParameters.OutputRoot = defaultOutputRoot;
|
|
|
|
|
buildParameters.BuildTarget = buildTarget;
|
2022-07-19 16:30:18 +08:00
|
|
|
|
buildParameters.BuildPipeline = EBuildPipeline.BuiltinBuildPipeline;
|
2022-05-04 00:12:06 +08:00
|
|
|
|
buildParameters.BuildMode = EBuildMode.ForceRebuild;
|
2022-10-28 10:46:35 +08:00
|
|
|
|
buildParameters.PackageName = "DefaultPackage";
|
|
|
|
|
buildParameters.PackageVersion = "1.0.0";
|
2022-05-04 00:12:06 +08:00
|
|
|
|
buildParameters.VerifyBuildingResult = true;
|
|
|
|
|
buildParameters.EncryptionServices = new GameEncryption();
|
|
|
|
|
buildParameters.CompressOption = ECompressOption.LZ4;
|
2022-10-08 16:25:36 +08:00
|
|
|
|
buildParameters.OutputNameStyle = EOutputNameStyle.HashName_Extension;
|
2022-10-18 19:27:47 +08:00
|
|
|
|
buildParameters.CopyBuildinFileOption = ECopyBuildinFileOption.None;
|
2022-07-19 16:30:18 +08:00
|
|
|
|
|
2022-03-03 19:13:07 +08:00
|
|
|
|
// 执行构建
|
|
|
|
|
AssetBundleBuilder builder = new AssetBundleBuilder();
|
2022-08-02 14:31:07 +08:00
|
|
|
|
var buildResult = builder.Run(buildParameters);
|
|
|
|
|
if (buildResult.Success)
|
2022-10-28 10:46:35 +08:00
|
|
|
|
{
|
|
|
|
|
Debug.Log($"构建成功 : {buildResult.OutputPackageDirectory}");
|
|
|
|
|
}
|
2022-03-03 18:08:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-10-28 10:46:35 +08:00
|
|
|
|
// 从构建命令里获取参数示例
|
2022-10-08 16:25:36 +08:00
|
|
|
|
private static string GetBuildPackageName()
|
2022-03-03 18:08:32 +08:00
|
|
|
|
{
|
2022-03-03 19:13:07 +08:00
|
|
|
|
foreach (string arg in System.Environment.GetCommandLineArgs())
|
|
|
|
|
{
|
2022-10-08 16:25:36 +08:00
|
|
|
|
if (arg.StartsWith("buildPackage"))
|
|
|
|
|
return arg.Split("="[0])[1];
|
2022-03-03 19:13:07 +08:00
|
|
|
|
}
|
2022-10-28 10:46:35 +08:00
|
|
|
|
return string.Empty;
|
2022-03-03 18:08:32 +08:00
|
|
|
|
}
|
|
|
|
|
````
|
|
|
|
|
|
2022-07-27 12:19:34 +08:00
|
|
|
|
### 重要概念
|
|
|
|
|
|
|
|
|
|
- **增量构建**
|
|
|
|
|
|
|
|
|
|
增量构建是在Unity的帮助下实现的一种快速打包机制。主要是利用资源构建相关的缓存文件来避免二次构建,以此来提高打包效率。
|
|
|
|
|
|
|
|
|
|
- **强制构建**
|
|
|
|
|
|
|
|
|
|
强制构建是每次构建之前,都会清空之前构建的所有缓存文件,以此来重新构建资源包。
|
|
|
|
|
|
|
|
|
|
- **首包资源**
|
|
|
|
|
|
2022-10-28 10:46:35 +08:00
|
|
|
|
在构建应用程序的时候,我们希望将某些资源打进首包里,首包资源拷贝至StreamingAssets/BuildinFiles/目录下。首包资源如果发生变化,也可以通过热更新来更新资源。
|
2022-07-27 12:19:34 +08:00
|
|
|
|
|
|
|
|
|
- **补丁包**
|
|
|
|
|
|
2022-10-28 10:46:35 +08:00
|
|
|
|
无论是通过增量构建还是强制构建,在构建完成后都会生成一个以包裹版本(PackageVersion)命名的文件夹,我们把这个文件夹统称为补丁包。补丁包里包含了游戏运行需要的所有资源,我们可以无脑的将补丁包内容覆盖到CDN目录下,也可以通过编写差异分析工具,来筛选出和线上最新版本之间的差异文件,然后将差异文件上传到CDN目录里。
|