Update document

pull/70/head
hevinci 2023-02-23 12:15:41 +08:00
parent a0bc521903
commit 0232e5adec
20 changed files with 125 additions and 65 deletions

View File

@ -1,6 +1,6 @@
# 资源构建
![image](./Image/AssetBuilder-img1.png)
![image](./Image/AssetBuilder-img1.jpg)
### 界面介绍
@ -50,9 +50,7 @@
HashName哈希值
HashName_Extension哈希值+后缀名
HashName_BundleName_Extension资源包名+哈希值+后缀名
BundleName_HashName资源包名+哈希值
- **Copy Buildin File Option**
@ -78,17 +76,23 @@
补丁包文件夹里包含补丁清单文件,资源包文件,构建报告文件等。
![image](./Image/AssetBuilder-img4.png)
![image](./Image/AssetBuilder-img2.jpg)
### 补丁清单
补丁清单是一个Json格式的文本文件。
补丁清单文件是上图中以PatchManifest开头命名的文件。
AssetList组记录的是主资源对象列表。
- PatchManifest_DefaultPackage_xxxxxx.hash
BundleList组记录的是资源包列表
记录了补丁清单文件的哈希值
![image](./Image/AssetBuilder-img2.png)
- PatchManifest_DefaultPackage_xxxxxx.json
该文件为Json文本格式主要用于开发者预览信息。
- PatchManifest_DefaultPackage_xxxxxx.bytes
该文件为二进制格式,主要用于程序内读取加载。
### Jenkins支持
@ -109,10 +113,10 @@ private static void BuildInternal(BuildTarget buildTarget)
buildParameters.BuildPipeline = EBuildPipeline.BuiltinBuildPipeline;
buildParameters.BuildMode = EBuildMode.ForceRebuild;
buildParameters.PackageName = "DefaultPackage";
buildParameters.PackageVersion = "1.0.0";
buildParameters.PackageVersion = "1.0";
buildParameters.VerifyBuildingResult = true;
buildParameters.CompressOption = ECompressOption.LZ4;
buildParameters.OutputNameStyle = EOutputNameStyle.HashName_Extension;
buildParameters.OutputNameStyle = EOutputNameStyle.HashName;
buildParameters.CopyBuildinFileOption = ECopyBuildinFileOption.None;
// 执行构建
@ -122,6 +126,10 @@ private static void BuildInternal(BuildTarget buildTarget)
{
Debug.Log($"构建成功 : {buildResult.OutputPackageDirectory}");
}
else
{
Debug.LogError($"构建失败 : {buildResult.FailedInfo}");
}
}
// 从构建命令里获取参数示例

View File

@ -1,10 +1,14 @@
# 资源收集
![image](./Image/AssetCollector-img1.png)
![image](./Image/AssetCollector-img1.jpg)
左侧为分组列表,右侧为该分组的配置界面。
导出按钮可以将配置数据导出为XML文件导入按钮可以导入保存的XML文件。
导入按钮可以导入保存的XML文件。
导出按钮可以将配置数据导出为XML文件。
修复按钮:在配置里的文件夹挪动位置之后,可以通过该按钮按钮来修正。
**注意**该工具仅支持Unity2019.4+
@ -14,6 +18,10 @@
是否展示资源包列表视图。
- Show Editor Alias
是否显示为中文模式。
- Enable Addressable
启用可寻址资源定位系统。
@ -36,10 +44,10 @@
//自定义扩展范例
public class DisableGroup : IActiveRule
{
public bool IsActiveGroup()
{
return false;
}
public bool IsActiveGroup()
{
return false;
}
}
````
@ -83,18 +91,18 @@
- AddressByFileName 以文件名为定位地址。
- AddressByGrouperAndFileName 以分组名+文件名为定位地址。
- AddressByGrouperAndFileName 以分组名+文件名为定位地址。
- AddressByCollectorAndFileName 以收集器名+文件名为定位地址。
- AddressByFolderAndFileName 以文件夹名+文件名为定位地址。
````c#
//自定义扩展范例
public class AddressByFileName : IAddressRule
{
string IAddressRule.GetAssetAddress(AddressRuleData data)
{
return Path.GetFileNameWithoutExtension(data.AssetPath);
}
string IAddressRule.GetAssetAddress(AddressRuleData data)
{
return Path.GetFileNameWithoutExtension(data.AssetPath);
}
}
````
@ -102,21 +110,28 @@
打包规则,规则可以自定义扩展。下面是内置规则:
- PackSeparately 以收集文件路径作为资源包名,每个资源文件单独打包。
- PackDirectory 以收集文件所在的文件夹路径作为资源包名,该文件夹下所有文件打进一个资源包。
- PackTopDirectory 以收集器路径下顶级文件夹为资源包名,该文件夹下所有文件打进一个资源包。
- PackSeparately 以文件路径作为资源包名,每个资源文件单独打包。
- PackDirectory 以文件所在的文件夹路径作为资源包名,该文件夹下所有文件打进一个资源包。
- PackTopDirectory 以收集器下顶级文件夹为资源包名,该文件夹下所有文件打进一个资源包。
- PackCollector 以收集器路径作为资源包名,收集的所有文件打进一个资源包。
- PackGrouper 以分组名称作为资源包名,收集的所有文件打进一个资源包。
- PackGroup 以分组名称作为资源包名,收集的所有文件打进一个资源包。
- PackRawFile 目录下的资源文件会被处理为原生资源包。
````c#
//自定义扩展范例
public class PackDirectory : IPackRule
{
string IPackRule.GetBundleName(PackRuleData data)
{
return Path.GetDirectoryName(data.AssetPath); //"Assets/Config/test.txt" --> "Assets/Config"
}
PackRuleResult IPackRule.GetBundleName(PackRuleData data)
{
//"Assets/Config/test.txt" --> "Assets/Config"
string bundleName = Path.GetDirectoryName(data.AssetPath);
PackRuleResult result = new PackRuleResult(bundleName, DefaultPackRule.AssetBundleFileExtension);
return result;
}
bool IPackRule.IsRawFilePackRule()
{
return false;
}
}
````
@ -133,13 +148,17 @@
//自定义扩展范例
public class CollectScene : IFilterRule
{
public bool IsCollectAsset(FilterRuleData data)
{
return Path.GetExtension(data.AssetPath) == ".unity";
}
public bool IsCollectAsset(FilterRuleData data)
{
return Path.GetExtension(data.AssetPath) == ".unity";
}
}
````
- **UserData**
用户自定义数据可以帮助定制化AddressRule和PackRule。
- **AssetTags**
资源分类标签列表,该收集器下收集的资源会全部被打上该标签。

View File

@ -4,22 +4,40 @@
如果是本地测试可以在本地创建一个WEB服务器然后将补丁包拷贝到WEB服务器下。
**按照游戏版本目录部署**
**部署目录**
在业务开发过程中,每个游戏版本实际都会创建一个SVN分支该分支工程内每次构建的补丁包上传到对应的CDN目录下即可
在业务开发过程中,发版本之前都会创建一个SVN或GIT分支以分支工程为基础去构建APP
````
CDN
└─android
├─v1.0
├─v1.1
└─v2.0
├─v1.0APP版本
├─v1.1APP版本
└─v2.0APP版本
└─iphone
├─v1.0
├─v1.1
└─v2.0
├─v1.0APP版本
├─v1.1APP版本
└─v2.0APP版本
````
**游戏版本说明**
**APP版本说明**
v1.0 代表的是APP版本不是资源版本。在没有更换安装包的情况下不需要新增加APP版本目录。
例如我们游戏的当前APP版本是v1.0那么每次生成的补丁文件全部覆盖到v1.0的目录下即可。
下面的示例里一共上传过2次补丁包。第二次上传的补丁包会把第一次的版本记录文件PatchManifest_DefaultPackage.version覆盖掉。当我们想回退资源版本的时候把第一次生成的版本记录文件覆盖到同目录下即可。
````
v1.0(游戏版本)
├─PatchManifest_DefaultPackage.version
├─PatchManifest_DefaultPackage_2023-02-01-654.hash
├─PatchManifest_DefaultPackage_2023-02-01-654.bytes
├─PatchManifest_DefaultPackage_2023-02-12-789.hash
├─PatchManifest_DefaultPackage_2023-02-12-789.bytes
├─2bb5a28d37dabf27df8bc6a4706b8f80.bundle
├─2dbea9c3056c8839bc03d80a2aebd105.bundle
├─6e8c3003a64ead36a0bd2d5cdebfbcf4.bundle
...
````
v1.0 代表的是游戏版本,不是资源版本。在没有更换安装包的前提下,不需要递增这个游戏版本。每次生成的补丁包只需要覆盖掉当前游戏版本目录下即可。

View File

@ -73,15 +73,17 @@ private class QueryStreamingAssetsFileServices : IQueryServices
{
public bool QueryStreamingAssets(string fileName)
{
// 注意使用了BetterStreamingAssets插件使用前需要初始化该插件
// StreamingAssetsHelper.cs是太空战机里提供的一个查询脚本。
string buildinFolderName = YooAssets.GetStreamingAssetBuildinFolderName();
return BetterStreamingAssets.FileExists($"{buildinFolderName}/{fileName}");
return StreamingAssetsHelper.FileExists($"{buildinFolderName}/{fileName}");
}
}
````
### 源代码解析
Package.InitializeAsync()方法解析。
- 编辑器模拟模式
每次启动调用EditorSimulateModeHelper.SimulateBuild()方法都会在底层执行一次模拟构建Simulate Build
@ -90,11 +92,11 @@ private class QueryStreamingAssetsFileServices : IQueryServices
- 单机运行模式
在初始化的时候会直接读取内置清单文件StreamingAssets文件夹里的文件最后根据加载的清单去验证沙盒里缓存的文件
在初始化的时候会直接读取内置清单文件StreamingAssets文件夹里的文件最后初始化缓存系统
- 联机运行模式
在初始化的时候,会优先从沙盒里加载清单,如果沙盒里不存在,则会尝试加载内置清单并将其拷贝到沙盒里。最后根据加载的清单去验证沙盒里缓存的文件
在初始化的时候,会优先从沙盒里加载清单,如果沙盒里不存在,则会尝试加载内置清单并将其拷贝到沙盒里。最后初始化缓存系统
**注意**:如果沙盒清单和内置清单都不存在,初始化也会被判定为成功!

View File

@ -16,8 +16,8 @@ private IEnumerator UpdateStaticVersion()
if (operation.Status == EOperationStatus.Succeed)
{
//更新成功
string PackageVersion = operation.PackageVersion;
Debug.Log($"Updated package Version : {PackageVersion}");
string packageVersion = operation.PackageVersion;
Debug.Log($"Updated package Version : {packageVersion}");
}
else
{
@ -66,7 +66,7 @@ private IEnumerator UpdatePatchManifest()
用于下载更新资源标签指定的资源包文件。
- YooAssets.CreateBundleDownloader(string[] locations, int downloadingMaxNumber, int failedTryAgain, int timeout)
- YooAssets.CreateBundleDownloader(AssetInfo[] assetInfos, int downloadingMaxNumber, int failedTryAgain, int timeout)
用于下载更新指定的资源列表依赖的资源包文件。
@ -131,25 +131,37 @@ private IEnumerator Start()
// 如果获取远端资源版本失败,说明当前网络无连接。
// 在正常开始游戏之前,需要验证本地清单内容的完整性。
string packageVersion = package.GetPackageVersion();
var operation = package.CheckPackageContentsAsync(packageVersion);
var operation = package.PreDownloadPackageAsync(packageVersion);
yield return operation;
if (operation.Status == EOperationStatus.Succeed)
if (operation.Status != EOperationStatus.Succeed)
{
StartGame();
ShowMessageBox("请检查本地网络,有新的游戏内容需要更新!");
yield break;
}
else
int downloadingMaxNum = 10;
int failedTryAgain = 3;
int timeout = 60;
var downloader = operation.CreatePatchDownloader(downloadingMaxNum, failedTryAgain, timeout);
if (downloader.TotalDownloadCount > 0)
{
// 资源内容本地并不完整,需要提示玩家联网更新。
ShowMessageBox("请检查本地网络,有新的游戏内容需要更新!");
yield break;
}
// 开始游戏
StartGame();
}
}
````
### 源代码解析
Package.UpdatePackageManifestAsync()方法解析。
- 联机运行模式
UpdatePackageManifestAsync()为资源清单更新方法。该方法的内部实现原理如下:
通过传入的清单版本,优先比对当前激活清单的版本,如果相同就直接返回成功。如果有差异就从缓存里去查找匹配的清单,如果缓存里不存在,就去远端下载并保存到沙盒里。最后加载沙盒内匹配的清单文件。
![image](./Image/CodeTutorial2-img1.png)

View File

@ -6,7 +6,9 @@
- LoadAssetAsync() 异步加载资源对象
- LoadSubAssetsSync() 同步加载子资源对象
- LoadSubAssetsAsync() 异步加载子资源对象
- LoadSceneSync() 同步加载场景
- LoadSceneAsync() 异步加载场景
- LoadRawFileSync() 同步获取原生文件
- LoadRawFileAsync() 异步获取原生文件
**统一约定**
@ -152,6 +154,7 @@ IEnumerator Start()
yield return handle;
byte[] fileData = handle.GetRawFileData();
string fileText = handle.GetRawFileText();
string filePath = handle.GetRawFilePath();
}
````
@ -160,7 +163,7 @@ IEnumerator Start()
通过资源标签来获取资源信息列表。
````c#
private GetAssetInfosByTag(string tag)
void GetAssetInfosByTag(string tag)
{
AssetInfo[] assetInfos = package.GetAssetInfos(tag);
foreach (var assetInfo in assetInfos)

View File

@ -1,6 +1,6 @@
# 全局配置
![image](./Image/Settings-img1.png)
![image](./Image/Settings-img1.jpg)
通过右键创建配置文件Project窗体内右键 -> Create -> YooAsset -> Create Setting
@ -8,7 +8,5 @@
配置说明:
- **Asset Bundle File Variant** : AssetBundle资源包后缀名
- **Raw File Variant** : 原生资源包后缀名
- **Patch Manifest File Name** : 补丁清单文件名称

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@ -1,6 +1,6 @@
# 着色器变种收集
![image](./Image/ShaderVariantCollector-img1.png)
![image](./Image/ShaderVariantCollector-img1.jpg)
点击搜集变种按钮开始收集,请耐心等待结束。