Update document
|
@ -8,10 +8,6 @@
|
||||||
|
|
||||||
构建输出的目录,会根据Unity编辑器当前切换的平台自动划分构建结果。
|
构建输出的目录,会根据Unity编辑器当前切换的平台自动划分构建结果。
|
||||||
|
|
||||||
- **Build Version**
|
|
||||||
|
|
||||||
构建版本号,也是资源版本号,版本号必须大于零。
|
|
||||||
|
|
||||||
- **Build Pipeline**
|
- **Build Pipeline**
|
||||||
|
|
||||||
构建管线
|
构建管线
|
||||||
|
@ -32,6 +28,10 @@
|
||||||
|
|
||||||
(4) 模拟构建模式:在编辑器下配合EditorSimulateMode运行模式,来模拟真实运行的环境。
|
(4) 模拟构建模式:在编辑器下配合EditorSimulateMode运行模式,来模拟真实运行的环境。
|
||||||
|
|
||||||
|
- **Build Package**
|
||||||
|
|
||||||
|
需要构建的资源包名称。
|
||||||
|
|
||||||
- **Encryption**
|
- **Encryption**
|
||||||
|
|
||||||
加密类列表。
|
加密类列表。
|
||||||
|
@ -52,10 +52,6 @@
|
||||||
|
|
||||||
(4) BundleName_HashName_Extension:资源包名+哈希值+后缀名
|
(4) BundleName_HashName_Extension:资源包名+哈希值+后缀名
|
||||||
|
|
||||||
- **Buildin Tags**
|
|
||||||
|
|
||||||
标记为安装包里的资源标签列表。构建成功后,会将相关标记的资源包拷贝到StreamingAssets文件夹下。
|
|
||||||
|
|
||||||
- **构建**
|
- **构建**
|
||||||
|
|
||||||
点击构建按钮会开始构建流程,构建流程分为多个节点顺序执行,如果某个节点发生错误,会导致构建失败。错误信息可以在控制台查看。
|
点击构建按钮会开始构建流程,构建流程分为多个节点顺序执行,如果某个节点发生错误,会导致构建失败。错误信息可以在控制台查看。
|
||||||
|
@ -98,8 +94,6 @@ public class GameEncryption : IEncryptionServices
|
||||||
|
|
||||||
补丁包文件夹里包含补丁清单文件,资源包文件,构建报告文件等。
|
补丁包文件夹里包含补丁清单文件,资源包文件,构建报告文件等。
|
||||||
|
|
||||||
资源包文件都是以文件的哈希值命名。
|
|
||||||
|
|
||||||
![image](./Image/AssetBuilder-img4.png)
|
![image](./Image/AssetBuilder-img4.png)
|
||||||
|
|
||||||
### 补丁清单
|
### 补丁清单
|
||||||
|
@ -119,9 +113,6 @@ private static void BuildInternal(BuildTarget buildTarget)
|
||||||
{
|
{
|
||||||
Debug.Log($"开始构建 : {buildTarget}");
|
Debug.Log($"开始构建 : {buildTarget}");
|
||||||
|
|
||||||
// 命令行参数
|
|
||||||
int buildVersion = GetBuildVersion();
|
|
||||||
|
|
||||||
// 构建参数
|
// 构建参数
|
||||||
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
|
string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot();
|
||||||
BuildParameters buildParameters = new BuildParameters();
|
BuildParameters buildParameters = new BuildParameters();
|
||||||
|
@ -129,14 +120,12 @@ private static void BuildInternal(BuildTarget buildTarget)
|
||||||
buildParameters.BuildTarget = buildTarget;
|
buildParameters.BuildTarget = buildTarget;
|
||||||
buildParameters.BuildPipeline = EBuildPipeline.BuiltinBuildPipeline;
|
buildParameters.BuildPipeline = EBuildPipeline.BuiltinBuildPipeline;
|
||||||
buildParameters.BuildMode = EBuildMode.ForceRebuild;
|
buildParameters.BuildMode = EBuildMode.ForceRebuild;
|
||||||
buildParameters.BuildVersion = buildVersion;
|
buildParameters.BuildPackage = "DefaultPackage";
|
||||||
buildParameters.BuildinTags = "buildin";
|
|
||||||
buildParameters.VerifyBuildingResult = true;
|
buildParameters.VerifyBuildingResult = true;
|
||||||
buildParameters.EnableAddressable = false;
|
buildParameters.EnableAddressable = true;
|
||||||
buildParameters.AppendFileExtension = false;
|
|
||||||
buildParameters.CopyBuildinTagFiles = true;
|
|
||||||
buildParameters.EncryptionServices = new GameEncryption();
|
buildParameters.EncryptionServices = new GameEncryption();
|
||||||
buildParameters.CompressOption = ECompressOption.LZ4;
|
buildParameters.CompressOption = ECompressOption.LZ4;
|
||||||
|
buildParameters.OutputNameStyle = EOutputNameStyle.HashName_Extension;
|
||||||
|
|
||||||
// 执行构建
|
// 执行构建
|
||||||
AssetBundleBuilder builder = new AssetBundleBuilder();
|
AssetBundleBuilder builder = new AssetBundleBuilder();
|
||||||
|
@ -146,12 +135,12 @@ private static void BuildInternal(BuildTarget buildTarget)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 从构建命令里获取参数
|
// 从构建命令里获取参数
|
||||||
private static int GetBuildVersion()
|
private static string GetBuildPackageName()
|
||||||
{
|
{
|
||||||
foreach (string arg in System.Environment.GetCommandLineArgs())
|
foreach (string arg in System.Environment.GetCommandLineArgs())
|
||||||
{
|
{
|
||||||
if (arg.StartsWith("buildVersion"))
|
if (arg.StartsWith("buildPackage"))
|
||||||
return int.Parse(arg.Split("="[0])[1]);
|
return arg.Split("="[0])[1];
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -167,14 +156,10 @@ private static int GetBuildVersion()
|
||||||
|
|
||||||
强制构建是每次构建之前,都会清空之前构建的所有缓存文件,以此来重新构建资源包。
|
强制构建是每次构建之前,都会清空之前构建的所有缓存文件,以此来重新构建资源包。
|
||||||
|
|
||||||
- **资源版本号**
|
|
||||||
|
|
||||||
资源版本号实际上只是构建结果的一个标记符号,在构建的时间轴上记录着每次打包的标记符号,此外资源版本号没有任何作用。
|
|
||||||
|
|
||||||
- **首包资源**
|
- **首包资源**
|
||||||
|
|
||||||
在构建应用程序的时候(例如安卓的APK),我们希望将某些资源打进首包里,可以通过设置Buildin Tags资源标签来决定哪些资源打进首包。首包资源如果发生变化,也可以通过热更新来更新资源。
|
在构建应用程序的时候(例如安卓的APK),我们希望将某些资源打进首包里,可以在构建成功后自己编写逻辑代码拷贝相关资源文件到StreamingAssets/YooAssets/目录里。首包资源如果发生变化,也可以通过热更新来更新资源。
|
||||||
|
|
||||||
- **补丁包**
|
- **补丁包**
|
||||||
|
|
||||||
无论是通过增量构建还是强制构建,在构建完成后都会生成一个以资源版本号命名的文件夹,我们把这个文件夹和里面的资源统称为补丁包。补丁包里包含了游戏运行需要的所有资源,我们可以无脑的将补丁包内容覆盖到CDN目录下,也可以通过编写差异分析工具,来筛选出和线上最新版本之间的差异文件,然后将差异文件上传到CDN目录里。
|
无论是通过增量构建还是强制构建,在构建完成后都会生成一个以补丁清单文件哈希值命名的文件夹,我们把这个文件夹统称为补丁包。补丁包里包含了游戏运行需要的所有资源,我们可以无脑的将补丁包内容覆盖到CDN目录下,也可以通过编写差异分析工具,来筛选出和线上最新版本之间的差异文件,然后将差异文件上传到CDN目录里。
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
# 资源收集
|
# 资源收集
|
||||||
|
|
||||||
![image](./Image/AssetGrouper-img1.png)
|
![image](./Image/AssetCollector-img1.png)
|
||||||
|
|
||||||
左侧为分组列表,右侧为该分组的配置界面。
|
左侧为分组列表,右侧为该分组的配置界面。
|
||||||
|
|
||||||
导出按钮可以将配置数据导出为XML文件,导入按钮可以导入保存的XML文件。
|
导出按钮可以将配置数据导出为XML文件,导入按钮可以导入保存的XML文件。
|
||||||
|
|
||||||
**注意**:该工具仅支持Unity2019+
|
**注意**:该工具仅支持Unity2019.4+
|
||||||
|
|
||||||
#### 公共设置
|
#### 公共设置
|
||||||
|
|
||||||
|
@ -14,14 +14,6 @@
|
||||||
|
|
||||||
启用可寻址资源定位系统。
|
启用可寻址资源定位系统。
|
||||||
|
|
||||||
- Auto Collect Shaders
|
|
||||||
|
|
||||||
自动收集所有依赖的材质球使用的着色器,并将这些着色器打进一个资源包里。
|
|
||||||
|
|
||||||
- Shader Bundle Name
|
|
||||||
|
|
||||||
收集的着色器资源包名称。
|
|
||||||
|
|
||||||
#### 资源分组
|
#### 资源分组
|
||||||
|
|
||||||
- Active Rule
|
- Active Rule
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
可以查看资源对象列表信息(AssetView),资源包列表信息(BundleView)。
|
可以查看资源对象列表信息(AssetView),资源包列表信息(BundleView)。
|
||||||
|
|
||||||
**注意**:该工具仅支持Unity2019+
|
**注意**:该工具仅支持Unity2019.4+
|
||||||
|
|
||||||
### 真机远程调试注意事项
|
### 真机远程调试注意事项
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
报告工具,可以查看概览信息(Summary),资源对象列表信息(AssetView),资源包列表信息(BundleView)。
|
报告工具,可以查看概览信息(Summary),资源对象列表信息(AssetView),资源包列表信息(BundleView)。
|
||||||
|
|
||||||
**注意**:该工具仅支持Unity2019+
|
**注意**:该工具仅支持Unity2019.4+
|
||||||
|
|
||||||
### 概览视图
|
### 概览视图
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
# 初始化
|
# 初始化
|
||||||
|
|
||||||
资源系统的运行模式支持三种:编辑器模拟模式,单机运行模式,联机运行模式。
|
初始化资源系统
|
||||||
|
|
||||||
````C#
|
```c#
|
||||||
// 资源系统初始化方法,根据不同的模式,我们传递不同的创建参数类
|
YooAssets.Initialize();
|
||||||
YooAssets.InitializeAsync(InitializeParameters parameters);
|
```
|
||||||
````
|
|
||||||
|
资源系统的运行模式支持三种:编辑器模拟模式,单机运行模式,联机运行模式。
|
||||||
|
|
||||||
**编辑器模拟模式**
|
**编辑器模拟模式**
|
||||||
|
|
||||||
|
@ -18,6 +19,7 @@ private IEnumerator InitializeYooAsset()
|
||||||
{
|
{
|
||||||
var initParameters = new YooAssets.EditorSimulateModeParameters();
|
var initParameters = new YooAssets.EditorSimulateModeParameters();
|
||||||
initParameters.LocationServices = new DefaultLocationServices("Assets/GameRes");
|
initParameters.LocationServices = new DefaultLocationServices("Assets/GameRes");
|
||||||
|
initParameters.SimulatePatchManifestPath = EditorSimulateModeHelper.SimulateBuild("DefaultPackage", false);
|
||||||
yield return YooAssets.InitializeAsync(initParameters);
|
yield return YooAssets.InitializeAsync(initParameters);
|
||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
@ -53,8 +55,6 @@ private IEnumerator InitializeYooAsset()
|
||||||
|
|
||||||
- DecryptionServices : 如果资源包在构建的时候有加密,需要提供实现IDecryptionServices接口的实例类。
|
- DecryptionServices : 如果资源包在构建的时候有加密,需要提供实现IDecryptionServices接口的实例类。
|
||||||
|
|
||||||
- ClearCacheWhenDirty : 安装包在覆盖安装的时候,是否清空沙盒缓存文件夹。
|
|
||||||
|
|
||||||
- DefaultHostServer : 默认的资源服务器IP地址。
|
- DefaultHostServer : 默认的资源服务器IP地址。
|
||||||
|
|
||||||
- FallbackHostServer : 备用的资源服务器IP地址。
|
- FallbackHostServer : 备用的资源服务器IP地址。
|
||||||
|
@ -66,24 +66,30 @@ private IEnumerator InitializeYooAsset()
|
||||||
{
|
{
|
||||||
var initParameters = new YooAssets.HostPlayModeParameters();
|
var initParameters = new YooAssets.HostPlayModeParameters();
|
||||||
initParameters.LocationServices = new DefaultLocationServices("Assets/GameRes");
|
initParameters.LocationServices = new DefaultLocationServices("Assets/GameRes");
|
||||||
initParameters.DecryptionServices = null;
|
initParameters.DecryptionServices = new BundleDecryptionServices();
|
||||||
initParameters.ClearCacheWhenDirty = false;
|
initParameters.QueryServices = new QueryStreamingAssetsServices();
|
||||||
initParameters.DefaultHostServer = "http://127.0.0.1/CDN1/Android/v1.0";
|
initParameters.DefaultHostServer = "http://127.0.0.1/CDN1/Android/v1.0";
|
||||||
initParameters.FallbackHostServer = "http://127.0.0.1/CDN2/Android/v1.0";
|
initParameters.FallbackHostServer = "http://127.0.0.1/CDN2/Android/v1.0";
|
||||||
initParameters.VerifyLevel = EVerifyLevel.High;
|
|
||||||
yield return YooAssets.InitializeAsync(initParameters);
|
yield return YooAssets.InitializeAsync(initParameters);
|
||||||
}
|
}
|
||||||
````
|
|
||||||
|
|
||||||
**资源文件解密**
|
// 文件解密服务类
|
||||||
|
private class BundleDecryptionServices : IDecryptionServices
|
||||||
````c#
|
|
||||||
public class BundleDecryption : IDecryptionServices
|
|
||||||
{
|
{
|
||||||
public ulong GetFileOffset(DecryptionFileInfo fileInfo)
|
public ulong GetFileOffset(DecryptionFileInfo fileInfo)
|
||||||
{
|
{
|
||||||
return 32;
|
return 32;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 内置文件查询服务类
|
||||||
|
private class QueryStreamingAssetsServices : IQueryServices
|
||||||
|
{
|
||||||
|
public bool QueryStreamingAssets(string fileName)
|
||||||
|
{
|
||||||
|
// 注意:使用了BetterStreamingAssets插件
|
||||||
|
return BetterStreamingAssets.FileExists($"YooAssets/{fileName}");
|
||||||
|
}
|
||||||
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,9 @@
|
||||||
|
|
||||||
**获取资源版本**
|
**获取资源版本**
|
||||||
|
|
||||||
对于联机运行模式,在更新补丁清单之前,需要获取一个资源版本号。
|
对于联机运行模式,在更新补丁清单之前,需要获取一个资源版本。
|
||||||
|
|
||||||
该资源版本号,可以通过YooAssets提供的接口来更新,也可以通过HTTP访问游戏服务器来获取。
|
该资源版本可以通过YooAssets提供的接口来更新,也可以通过HTTP访问游戏服务器来获取。
|
||||||
|
|
||||||
````c#
|
````c#
|
||||||
private IEnumerator UpdateStaticVersion()
|
private IEnumerator UpdateStaticVersion()
|
||||||
|
@ -15,8 +15,8 @@ private IEnumerator UpdateStaticVersion()
|
||||||
if (operation.Status == EOperationStatus.Succeed)
|
if (operation.Status == EOperationStatus.Succeed)
|
||||||
{
|
{
|
||||||
//更新成功
|
//更新成功
|
||||||
int resourceVersion = operation.ResourceVersion;
|
string packageCRC = operation.PackageCRC;
|
||||||
Debug.Log($"Update resource Version : {resourceVersion}");
|
Debug.Log($"Update resource Version : {packageCRC}");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -33,7 +33,7 @@ private IEnumerator UpdateStaticVersion()
|
||||||
````c#
|
````c#
|
||||||
private IEnumerator UpdatePatchManifest()
|
private IEnumerator UpdatePatchManifest()
|
||||||
{
|
{
|
||||||
UpdateManifestOperation operation = YooAssets.UpdateManifestAsync(resourceVersion);
|
UpdateManifestOperation operation = YooAssets.UpdateManifestAsync(packageCRC);
|
||||||
yield return operation;
|
yield return operation;
|
||||||
|
|
||||||
if (operation.Status == EOperationStatus.Succeed)
|
if (operation.Status == EOperationStatus.Succeed)
|
||||||
|
@ -120,23 +120,22 @@ private IEnumerator UpdateStaticVersion()
|
||||||
{
|
{
|
||||||
// 如果获取远端资源版本成功,说明当前网络连接并无问题,可以走正常更新流程。
|
// 如果获取远端资源版本成功,说明当前网络连接并无问题,可以走正常更新流程。
|
||||||
......
|
......
|
||||||
|
|
||||||
// 注意:在成功下载所有资源之后,我们需要记录当前最新的资源版本号
|
// 注意:在成功下载所有资源之后,我们需要记录当前最新的资源版本号
|
||||||
PlayerPrefs.SetInt("STATIC_VERSION", resourceVersion);
|
PlayerPrefs.SetString("STATIC_VERSION", packageCRC);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// 如果获取远端资源版本失败,我们走弱联网更新模式。
|
// 如果获取远端资源版本失败,我们走弱联网更新模式。
|
||||||
// 注意:如果从来没有保存过版本信息,则需要从内部读取StaticVersion.bytes文件的版本信息。
|
// 注意:如果从来没有保存过版本信息,则需要从内部读取StaticVersion.bytes文件的版本信息。
|
||||||
int staticVersion = PlayerPrefs.GetInt("STATIC_VERSION", -1);
|
string packageCRC = PlayerPrefs.GetString("STATIC_VERSION", string.Empty);
|
||||||
if (staticVersion == -1)
|
if (packageCRC == string.Empty)
|
||||||
{
|
{
|
||||||
staticVersion = LoadStaticVersionFromStreamingAssets();
|
packageCRC = LoadStaticVersionFromStreamingAssets();
|
||||||
PlayerPrefs.SetInt("STATIC_VERSION", staticVersion);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 在弱联网情况下更新补丁清单
|
// 在弱联网情况下更新补丁清单
|
||||||
UpdateManifestOperation operation2 = YooAssets.WeaklyUpdateManifestAsync(staticVersion);
|
UpdateManifestOperation operation2 = YooAssets.WeaklyUpdateManifestAsync(packageCRC);
|
||||||
yield return operation2;
|
yield return operation2;
|
||||||
if (operation2.Status == EOperationStatus.Succeed)
|
if (operation2.Status == EOperationStatus.Succeed)
|
||||||
{
|
{
|
||||||
|
@ -151,4 +150,3 @@ private IEnumerator UpdateStaticVersion()
|
||||||
}
|
}
|
||||||
````
|
````
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -53,3 +53,47 @@ var go = Instantiate(obj, transform);
|
||||||
go.transform.localPosition = Vector3.zero;
|
go.transform.localPosition = Vector3.zero;
|
||||||
go.transform.localScale = Vector3.one;
|
go.transform.localScale = Vector3.one;
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 分布式构建解决方案
|
||||||
|
|
||||||
|
**1.3.0+版本升级指南**
|
||||||
|
|
||||||
|
在升级之前请导出AssetBundleCollector的配置为XML文件,然后升级YooAssets库。
|
||||||
|
|
||||||
|
首次需要打开AssetBundleCollector窗口,然后导入之前保存的XML文件。
|
||||||
|
|
||||||
|
在运行游戏之前,请保证资源包可以构建成功!
|
||||||
|
|
||||||
|
```c#
|
||||||
|
public static YooAssetPackage AssetPackage;
|
||||||
|
|
||||||
|
IEnumerator Start()
|
||||||
|
{
|
||||||
|
// 初始化YooAssets资源系统(必须代码)
|
||||||
|
YooAssets.Initialize();
|
||||||
|
|
||||||
|
// 创建资源包实例
|
||||||
|
AssetPackage = YooAssets.CreateAssetPackage("DefaultPackage");
|
||||||
|
|
||||||
|
// 初始化资源包
|
||||||
|
......
|
||||||
|
yield return AssetPackage.InitializeAsync(createParameters);
|
||||||
|
|
||||||
|
// 更新资源包版本
|
||||||
|
......
|
||||||
|
var operation = AssetPackage.UpdateManifestAsync(packageCRC);
|
||||||
|
yield return operation;
|
||||||
|
|
||||||
|
// 下载更新文件
|
||||||
|
var downloader = AssetPackage.CreatePatchDownloader(downloadingMaxNum, failedTryAgain);
|
||||||
|
downloader.BeginDownload();
|
||||||
|
yield return downloader;
|
||||||
|
|
||||||
|
// 加载资源对象
|
||||||
|
var assetHandle = AssetPackage.LoadAssetAsync("Assets/GameRes/npc.prefab");
|
||||||
|
yield return assetHandle;
|
||||||
|
......
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 38 KiB |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 63 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 52 KiB |
After Width: | Height: | Size: 129 KiB |
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 77 KiB |
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 86 KiB |
Before Width: | Height: | Size: 96 KiB |
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 96 KiB |