Update document

pull/51/head
hevinci 2022-10-08 16:25:36 +08:00
parent f07cbcbb81
commit e277649878
15 changed files with 92 additions and 67 deletions

View File

@ -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目录里。

View File

@ -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

View File

@ -4,7 +4,7 @@
可以查看资源对象列表信息AssetView资源包列表信息BundleView 可以查看资源对象列表信息AssetView资源包列表信息BundleView
**注意**该工具仅支持Unity2019+ **注意**该工具仅支持Unity2019.4+
### 真机远程调试注意事项 ### 真机远程调试注意事项

View File

@ -2,7 +2,7 @@
报告工具可以查看概览信息Summary资源对象列表信息AssetView资源包列表信息BundleView 报告工具可以查看概览信息Summary资源对象列表信息AssetView资源包列表信息BundleView
**注意**该工具仅支持Unity2019+ **注意**该工具仅支持Unity2019.4+
### 概览视图 ### 概览视图

View File

@ -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}");
}
}
```` ````

View File

@ -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)
@ -122,21 +122,20 @@ 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()
} }
```` ````

View File

@ -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;
......
}
```

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

After

Width:  |  Height:  |  Size: 96 KiB