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