From 0237f007519f41b7e656055407a34a6608cda3f7 Mon Sep 17 00:00:00 2001 From: hevinci Date: Thu, 3 Mar 2022 18:08:32 +0800 Subject: [PATCH] Update document --- Docs/AssetBuilder.md | 133 +++++++++++++++++++++++++++++++ Docs/AssetCollector.md | 74 +++++++++++++++++ Docs/AssetDeploy.md | 3 + Docs/Image/AssetBuilder-img4.jpg | Bin 0 -> 63409 bytes Docs/Image/Settings-img1.jpg | Bin 0 -> 32412 bytes Docs/QuickStart.md | 27 +++++++ Docs/Settings.md | 20 +++++ Docs/YooAssetInit.md | 66 +++++++++++++++ Docs/YooAssetLoader.md | 120 ++++++++++++++++++++++++++++ Docs/YooAssetUpdater.md | 113 ++++++++++++++++++++++++++ README.md | 108 ++++++------------------- 11 files changed, 581 insertions(+), 83 deletions(-) create mode 100644 Docs/AssetBuilder.md create mode 100644 Docs/AssetCollector.md create mode 100644 Docs/AssetDeploy.md create mode 100644 Docs/Image/AssetBuilder-img4.jpg create mode 100644 Docs/Image/Settings-img1.jpg create mode 100644 Docs/QuickStart.md create mode 100644 Docs/Settings.md create mode 100644 Docs/YooAssetInit.md create mode 100644 Docs/YooAssetLoader.md create mode 100644 Docs/YooAssetUpdater.md diff --git a/Docs/AssetBuilder.md b/Docs/AssetBuilder.md new file mode 100644 index 0000000..b401b5a --- /dev/null +++ b/Docs/AssetBuilder.md @@ -0,0 +1,133 @@ +# 资源构建 + +![image](https://github.com/tuyoogame/YooAsset/raw/main/Docs/Image/AssetBuilder-img1.jpg) + +### 界面介绍 + +**Build Output** + +构建输出的目录,会根据Unity编辑器当前切换的平台自动划分构建结果。 + +**Build Version** + +构建版本号,也是资源版本号,版本号必须大于零。 + +**Compression** + +资源包的压缩方式。 + +**Append Extension** + +构建的资源包文件名是否包含后缀格式。 + +**Force Rebuild** + +是否为强制重新构建,如果不勾选则为增量构建模式。注意:强制重建会删除当前平台下所有的补丁包文件。 + +**Buildin Tags** + +标记为安装包里的资源标签列表。构建成功后,会将相关标记的资源包拷贝到StreamingAssets文件夹下。 + +**Build** + +点击Build按钮会开始构建流程,构建流程分为多个节点顺序执行,如果某个节点发生错误,会导致构建失败。错误信息可以在控制台查看。 + +### 资源包加密 + +编写继承IAssetEncrypter接口的加密类。注意:加密类文件需要放置在Editor文件夹里。 + +````C# +public class AssetEncrypter : IAssetEncrypter +{ + /// + /// 检测资源包是否需要加密 + /// + bool IAssetEncrypter.Check(string filePath) + { + // 对配置表相关的资源包进行加密 + return filePath.Contains("Assets/Config/"); + } + + /// + /// 对数据进行加密,并返回加密后的数据 + /// + byte[] IAssetEncrypter.Encrypt(byte[] fileData) + { + int offset = 32; + var temper = new byte[fileData.Length + offset]; + Buffer.BlockCopy(fileData, 0, temper, offset, fileData.Length); + return temper; + } +} +```` + +### 补丁包 + +构建成功后会在输出目录下找到补丁包文件夹,该文件夹名称为本次构建时指定的资源版本号。 + +补丁包文件夹里包含补丁清单和资源包文件以及说明文件,资源包文件都是以文件的哈希值命名。 + +![image](https://github.com/tuyoogame/YooAsset/raw/main/Docs/Image/AssetBuilder-img4.jpg) + +### 补丁清单 + +补丁清单是一个Json格式的文本文件,里面包含了所有资源包的信息,例如:名称,版本,大小,CRC等。 + +![image](https://github.com/tuyoogame/YooAsset/raw/main/Docs/Image/AssetBuilder-img2.jpg) + +### Jenkins支持 + +如果需要自动化构建,可以参考如下代码范例: + +````c# +private static void BuildInternal(BuildTarget buildTarget) +{ + Debug.Log($"开始构建 : {buildTarget}"); + + // 打印命令行参数 + int buildVersion = GetBuildVersion(); + bool isForceBuild = IsForceBuild(); + Debug.Log($"资源版本 : {buildVersion}"); + Debug.Log($"强制重建 : {isForceBuild}"); + + // 构建参数 + string defaultOutputRoot = AssetBundleBuilderHelper.GetDefaultOutputRoot(); + AssetBundleBuilder.BuildParameters buildParameters = new AssetBundleBuilder.BuildParameters(); + buildParameters.IsVerifyBuildingResult = true; + buildParameters.OutputRoot = defaultOutputRoot; + buildParameters.BuildTarget = buildTarget; + buildParameters.BuildVersion = buildVersion; + buildParameters.CompressOption = ECompressOption.LZ4; + buildParameters.AppendFileExtension = false; + buildParameters.IsForceRebuild = isForceBuild; + buildParameters.BuildinTags = "buildin"; + + // 执行构建 + AssetBundleBuilder builder = new AssetBundleBuilder(); + builder.Run(buildParameters); + + // 构建完成 + Debug.Log("构建完成"); +} + +// 从构建命令里获取参数 +private static int GetBuildVersion() +{ + foreach (string arg in System.Environment.GetCommandLineArgs()) + { + if (arg.StartsWith("buildVersion")) + return int.Parse(arg.Split("="[0])[1]); + } + return -1; +} +private static bool IsForceBuild() +{ + foreach (string arg in System.Environment.GetCommandLineArgs()) + { + if (arg.StartsWith("forceBuild")) + return arg.Split("="[0])[1] == "true" ? true : false; + } + return false; +} +```` + diff --git a/Docs/AssetCollector.md b/Docs/AssetCollector.md new file mode 100644 index 0000000..74169ec --- /dev/null +++ b/Docs/AssetCollector.md @@ -0,0 +1,74 @@ +# 资源收集 + +![image](https://github.com/tuyoogame/YooAsset/raw/main/Docs/Image/AssetCollector-img1.jpg) + +### 界面介绍 + +**着色器收集** + +勾选收集所有着色器复选框后,打包系统会自动收集所有依赖的材质球使用的着色器,并将这些着色器打进一个AssetBundle文件内。 + +**Directory** + +收集的资源目录,目录下的所有文件将会根据打包规则和过滤规则进行打包。 + +**PackRule** + +打包规则,规则可以自定义扩展。下面是内置的打包规则: + +1. PackExplicit 目录下的资源文件会各自打进自己的资源包里。 +2. PackDirectory 目录下的资源文件会被打进一个资源包里。 +3. PackRawFile 目录下的资源文件会被处理为原生资源包。 + +自定义扩展范例 + +````c# +public class PackDirectory : IPackRule +{ + string IPackRule.GetAssetBundleLabel(string assetPath) + { + return Path.GetDirectoryName(assetPath); //"Assets/Config/test.txt" --> "Assets/Config" + } +} +```` + +**FilterRule** + +过滤规则,规则可以自定义扩展。下面是内置的过滤规则: + +1. CollectAll 收集目录下的所有资源文件 +2. CollectScene 只收集目录下的场景文件 +3. CollectPrefab 只收集目录下的预制体文件 +4. CollectSprite 只收集目录下的精灵类型的文件 + +自定义扩展范例 + +````c# +public class CollectScene : IFilterRule +{ + public bool IsCollectAsset(string assetPath) + { + return Path.GetExtension(assetPath) == ".unity"; + } +} +```` + +**DontWriteAssetPath** + +资源目录下的资源对象不写入清单 + +**AssetTags** + +资源标签列表(多个标签使用分号间隔) + +### 配置表 + +点击Import按钮可以导入外部的XML配置表,配置表规范如下图: + +````xml + + + + +```` + diff --git a/Docs/AssetDeploy.md b/Docs/AssetDeploy.md new file mode 100644 index 0000000..899a678 --- /dev/null +++ b/Docs/AssetDeploy.md @@ -0,0 +1,3 @@ +# 资源部署 + +监听 \ No newline at end of file diff --git a/Docs/Image/AssetBuilder-img4.jpg b/Docs/Image/AssetBuilder-img4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62963d92546f0649bfae91463256aed01efbceb4 GIT binary patch literal 63409 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 z%0A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

{O)k9kv`ug*|Y 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 JeO!P1`fr5!*J=O& literal 0 HcmV?d00001 diff --git a/Docs/QuickStart.md b/Docs/QuickStart.md new file mode 100644 index 0000000..b91727d --- /dev/null +++ b/Docs/QuickStart.md @@ -0,0 +1,27 @@ +# 快速开始 + +**下载安装** + +1. 通过OpenUPM安装 +2. 通过Packages安装 +3. 通过GIT安装 + +**系统需求** + +支持版本: Unity2018.4+ + +支持平台: Windows、OSX、Android、iOS + +开发环境: .NET4.x + +**目录结构** + +```` +Assets +└─ YooAsset + ├─ Editor 编辑器源码目录 + ├─ Runtime 运行时源码目录 + ├─ LICENSE 版权文档 + └─ README 说明文档 +```` + diff --git a/Docs/Settings.md b/Docs/Settings.md new file mode 100644 index 0000000..fdb56f7 --- /dev/null +++ b/Docs/Settings.md @@ -0,0 +1,20 @@ +# 全局配置 + +![image](https://github.com/tuyoogame/YooAsset/raw/main/Docs/Image/Settings-img1.jpg) + +通过右键创建配置文件(Project窗体内右键 -> Create -> YooAsset -> Create Setting) + +**注意**:请将配置文件放在Resources文件夹下 + +**Asset Bundle File Variant** : AssetBundle资源包后缀名 + +**Raw File Variant** : 原生资源包后缀名 + +**Patch Manifest File Name** : 补丁清单文件名 + +**Patch Manifest Hash File Name** : 补丁清单哈希文件名 + +**Unity Manifest File Name** : Unity构建的清单名称 + +**Readme File Name** : 说明文件名称 + diff --git a/Docs/YooAssetInit.md b/Docs/YooAssetInit.md new file mode 100644 index 0000000..10c9392 --- /dev/null +++ b/Docs/YooAssetInit.md @@ -0,0 +1,66 @@ +# 初始化 + +资源系统的运行模式支持三种:编辑器模拟模式,单机运行模式,联机运行模式。 + +````C# +// 资源系统初始化方法,根据不同的模式,我们传递不同的创建参数类 +YooAssets.InitializeAsync(CreateParameters parameters); +```` + +**编辑器模拟模式** + +在编辑器下,不需要构建资源包,来模拟运行游戏。 + +注意:该模式只在编辑器下起效 + +````c# +private IEnumerator InitializeYooAsset() +{ + var createParameters = new YooAssets.EditorPlayModeParameters(); + createParameters.LocationRoot = "Assets/GameRes"; + yield return YooAssets.InitializeAsync(createParameters); +} +```` + +**单机运行模式** + +对于不需要热更新资源的游戏,可以使用单机运行模式。 + +注意:该模式需要构建资源包 + +````c# +private IEnumerator InitializeYooAsset() +{ + var createParameters = new YooAssets.OfflinePlayModeParameters(); + createParameters.LocationRoot = "Assets/GameRes"; + yield return YooAssets.InitializeAsync(createParameters); +} +```` + +**联机运行模式** + +对于需要热更新资源的游戏,可以使用联机运行模式,该模式下初始化参数会很多。 + +注意:该模式需要构建资源包 + +- LocationRoot : 资源定位的根路径,所有通过代码加载的资源文件都需要放在资源定位的根路径下。 +- DecryptServices : 如果资源包在构建的时候有加密,那么需要提供实现IDecryptServices接口的实例类。 +- ClearCacheWhenDirty : 安装包在覆盖安装的时候,是否清空沙盒缓存文件夹。 +- IgnoreResourceVersion : 是否忽略资源版本号,请参考进阶教程。 +- DefaultHostServer : 默认的资源服务器IP地址。 +- FallbackHostServer : 备用的资源服务器IP地址。 + +````c# +private IEnumerator InitializeYooAsset() +{ + var createParameters = new YooAssets.HostPlayModeParameters(); + createParameters.LocationRoot = "Assets/GameRes"; + createParameters.DecryptServices = null; + createParameters.ClearCacheWhenDirty = false; + createParameters.IgnoreResourceVersion = false; + createParameters.DefaultHostServer = "http://127.0.0.1/CDN1/Android"; + createParameters.FallbackHostServer = "http://127.0.0.1/CDN2/Android"; + yield return YooAssets.InitializeAsync(createParameters); +} +```` + diff --git a/Docs/YooAssetLoader.md b/Docs/YooAssetLoader.md new file mode 100644 index 0000000..b9ce148 --- /dev/null +++ b/Docs/YooAssetLoader.md @@ -0,0 +1,120 @@ +# 资源加载 + +在加载资源对象的时候只需要提供相对路径,统一约定该相对路径名称为:location + +资源加载接口: + +- YooAssets.LoadAssetSync() 同步加载资源对象接口 +- YooAssets.LoadSubAssetsSync() 同步加载子资源对象接口 +- YooAssets.LoadAssetAsync() 异步加载资源对象接口 +- YooAssets.LoadSubAssetsAsync() 异步加载子资源对象接口 +- YooAssets.LoadSceneAsync() 异步加载场景接口 + +**加载路径的匹配方式** + +````C# +// 不带扩展名的模糊匹配 +YooAssets.LoadAssetAsync("Audio/bgMusic"); + +// 带扩展名的精准匹配 +YooAssets.LoadAssetAsync("Audio/bgMusic.mp3"); +```` + +**异步加载范例** + +````C# +// 委托加载方式 +void Start() +{ + AssetOperationHandle handle = YooAssets.LoadAssetAsync("Audio/bgMusic.mp3"); + handle.Completed += Handle_Completed; +} +void Handle_Completed(AssetOperationHandle handle) +{ + AudioClip audioClip = handle.AssetObject as AudioClip; +} +```` +````C# +// 协程加载方式 +void Start() +{ + this.StartCoroutine(AsyncLoad()); +} +IEnumerator AsyncLoad() +{ + AssetOperationHandle handle = YooAssets.LoadAssetAsync("Audio/bgMusic.mp3"); + yield return handle; + AudioClip audioClip = handle.AssetObject as AudioClip; +} +```` +````C# +// Task加载方式 +async void Start() +{ + await AsyncLoad(); +} +async Task AsyncLoad() +{ + AssetOperationHandle handle = YooAssets.LoadAssetAsync("Audio/bgMusic.mp3"); + await handle.Task; + AudioClip audioClip = handle.AssetObject as AudioClip; +} +```` + +**资源卸载范例** + +````C# +void Start() +{ + AssetOperationHandle handle = YooAssets.LoadAssetAsync("Audio/bgMusic.mp3"); + + ... + + handle.Release(); +} +```` + +**预制体同步加载范例** + +````C# +var handle = YooAssets.LoadAssetSync(location); +GameObject go = handle.InstantiateObject; +```` + +````c# +var handle = YooAssets.LoadAssetSync(location); +GameObject go = UnityEngine.Object.Instantiate(handle.AssetObject as GameObject); +```` + +**子对象同步加载范例** + +例如:通过TexturePacker创建的图集,如果需要访问图集的精灵对象,可以通过子对象加载接口。 + +````c# +var handle = YooAssets.LoadSubAssetsSync(location); +foreach (var asset in handle.AllAssets) +{ + Debug.Log($"Sprite name is {asset.name}"); +} +```` + +**场景异步加载范例** + +````c# +void Start() +{ + // 场景加载参数 + SceneInstanceParam param = new SceneInstanceParam(); + param.LoadMode = UnityEngine.SceneManagement.LoadSceneMode.Single; + param.ActivateOnLoad = true; + + AssetOperationHandle handle = YooAssets.LoadSceneAsync("Scene/Login", param); + handle.Completed += Handle_Completed; +} +void Handle_Completed(AssetOperationHandle handle) +{ + SceneInstance instance = handle.AssetInstance as SceneInstance; + Debug.Log(instance.Scene.name); +} +```` + diff --git a/Docs/YooAssetUpdater.md b/Docs/YooAssetUpdater.md new file mode 100644 index 0000000..b8101fc --- /dev/null +++ b/Docs/YooAssetUpdater.md @@ -0,0 +1,113 @@ +# 资源更新 + +**更新补丁清单** + +对于联机运行模式,在初始化资源系统之后,需要立刻更新资源清单。 + +在此之前,需要获取更新的资源版本号,一般通过HTTP访问游戏服务器来获取。 + +````c# +private IEnumerator UpdatePatchManifest() +{ + int updateResourceVersion = 123; + int timeout = 30; + UpdateManifestOperation operation = YooAssets.UpdateManifestAsync(updateResourceVersion, timeout); + yield return operation; + + if(operation.Status == EOperationStatus.Succeed) + { + //更新成功 + } + else + { + //更新失败 + Debug.LogError(operation.Error); + } +} +```` + +**补丁包下载** + +在补丁清单更新完毕后,就可以更新资源文件了。 + +根据产品需求,可以选择更新全部资源,或者只更新部分资源。 + +````c# +private PatchDownloader _downloader; + +///

+/// 创建下载器 +/// +private void CreateDownloader() +{ + string[] tags = { "buildin", "config" }; + int downloadingMaxNum = 10; + int failedTryAgain = 3; + _downloader = YooAssets.CreateDLCDownloader(tags, 10, 3); + if (_downloader.TotalDownloadCount == 0) + { + //没有需要下载的资源 + } + else + { + //需要下载的文件总数和总大小 + int totalDownloadCount = _downloader.TotalDownloadCount; + long totalDownloadBytes = _downloader.TotalDownloadBytes; + } +} + +/// +/// 更新下载器 +/// +private void UpdateDownloader() +{ + if(_downloader != null) + _downloader.Update(); +} + +/// +/// 开启下载 +/// +private IEnumerator Download() +{ + //注册下载回调 + _downloader.OnPatchFileDownloadFailedCallback = OnPatchFileDownloadFailed; + _downloader.OnDownloadProgressCallback = OnDownloadProgressUpdate; + _downloader.OnDownloadOverCallback = OnDownloadOver; + _downloader.Download(); + yield return _downloader; + + //检测下载结果 + if (_downloader.DownloadStates == EDownloaderStates.Succeed) + { + //下载成功 + } + else + { + //下载失败 + } +} + +/// +/// 文件下载失败 +/// +private void OnPatchFileDownloadFailed(string fileName) +{ + Debug.LogError($"File download failed : {fileName}"); +} + +/// +/// 下载进度的更新 +/// +private void OnDownloadProgressUpdate(int totalDownloadCount, int currentDownloadCount, long totalDownloadSizeBytes, long currentDownloadSizeBytes) +{ +} + +/// +/// 下载结束,成功或失败 +/// +private void OnDownloadOver(bool isSucceed) +{ +} +```` + diff --git a/README.md b/README.md index 1ac2fec..18f5f8d 100644 --- a/README.md +++ b/README.md @@ -1,101 +1,43 @@ # YooAsset -YooAsset是基于Unity3D引擎的资源管理插件。 +YooAsset是一个基于Unity3D引擎的资源管理插件。 -# 支持版本 -Unity2018.4 && Unity2019.4 && Unity2020.3 - -# 开发环境 -C# && .Net4.x - -# 特点 -#### 强大灵活的打包系统 +## 特点 +**强大灵活的打包系统** 可以自定义打包策略,可以自定义冗余规则,自动分析依赖实现资源零冗余,基于资源对象的资源包依赖管理方案,避免了资源包之间循环依赖的问题。 -#### 安全高效的分包方案 +**安全高效的分包方案** 基于资源对象的标签分包方案,自动对依赖资源包进行分类,避免人工维护成本。可以非常方便的实现零资源安装包,或者全量资源安装包。 -#### 灵活高效的加密方案 +**灵活高效的加密方案** 提供多种加密策略,可以自定义加密规则,基于Unity官方的高效解密方案。 -#### 基于引用计数方案 +**基于引用计数方案** 基于引用技术的资源管理方案,可以帮助我们实现安全的资源卸载策略,更好的对内存管理,避免资源对象冗余。还有强大的分析器可帮助发现潜在的资源泄漏问题。 -#### 多种模式自由切换 +**多种模式自由切换** 编辑器模拟模式,单机运行模式,联机运行模式。在编辑器模拟模式下,可以不构建资源包来模拟线上环境,在不修改任何代码的情况下,可以自由切换到其它模式。 -#### 强大安全的加载系统 -1. **异步加载和同步加载** 异步加载接口支持协程,Task,委托。支持异步加载和同步加载混合使用。 -2. **边玩边下载** 在加载资源对象的时候,如果资源对象依赖的资源包在本地不存在,会自动从服务器下载到本地,然后再加载资源对象。 -3. **多线程下载** 支持断点续传,自动验证下载文件,自动修复损坏文件。可以自定义下载失败重试次数,下载超时判定时间。 -4. **多功能下载器** 可以按照资源标签列表创建下载器,也可以按照资源对象列表创建下载器。下载器可以设置同时下载文件数的限制,设置下载失败重试次数,多个下载器同时下载不用担心文件重复下载问题,下载器还提供了下载进度以及下载失败异常等常用接口。 +**强大安全的加载系统** -#### 原生格式文件管理 +- **异步加载和同步加载** 异步加载接口支持协程,Task,委托。支持异步加载和同步加载混合使用。 +- **边玩边下载** 在加载资源对象的时候,如果资源对象依赖的资源包在本地不存在,会自动从服务器下载到本地,然后再加载资源对象。 +- **多线程下载** 支持断点续传,自动验证下载文件,自动修复损坏文件。可以自定义下载失败重试次数,下载超时判定时间。 +- **多功能下载器** 可以按照资源标签列表创建下载器,也可以按照资源对象列表创建下载器。下载器可以设置同时下载文件数的限制,设置下载失败重试次数,多个下载器同时下载不用担心文件重复下载问题,下载器还提供了下载进度以及下载失败异常等常用接口。 + +**原生格式文件管理** 无缝衔接资源打包系统,可以很方便的实现原生文件的版本管理和下载。 -#### 灵活多变的版本管理 +**灵活多变的版本管理** 支持线上版本快速回退,支持区分审核版本,测试版本,线上版本,支持灰度更新及测试。 +## 入门教程 +**1. 快速开始** +**2. 全局配置** +**3. 资源收集** +**4. 资源打包** +**5. 资源部署** -# 教程 -#### 加载路径的匹配方式 -````C# -// 不带扩展名的模糊匹配 -YooAssets.LoadAssetAsync("Audio/bgMusic"); - -// 带扩展名的精准匹配 -YooAssets.LoadAssetAsync("Audio/bgMusic.mp3"); -```` - -#### 异步加载 -````C# -// 委托加载方式 -void Start() -{ - AssetOperationHandle handle = YooAssets.LoadAssetAsync("Audio/bgMusic.mp3"); - handle.Completed += Handle_Completed; -} -void Handle_Completed(AssetOperationHandle handle) -{ - if(handle.AssetObject == null) return; - AudioClip audioClip = handle.AssetObject as AudioClip; -} -```` -````C# -// 协程加载方式 -void Start() -{ - this.StartCoroutine(AsyncLoad()); -} -IEnumerator AsyncLoad() -{ - AssetOperationHandle handle = YooAssets.LoadAssetAsync("Audio/bgMusic.mp3"); - yield return handle; - AudioClip audioClip = handle.AssetObject as AudioClip; -} -```` -````C# -// Task加载方式 -async void Start() -{ - await AsyncLoad(); -} -async Task AsyncLoad() -{ - AssetOperationHandle handle = YooAssets.LoadAssetAsync("Audio/bgMusic.mp3"); - await handle.Task; - AudioClip audioClip = handle.AssetObject as AudioClip; -} -```` - -#### 资源卸载 -````C# -public void Start() -{ - AssetOperationHandle handle = YooAssets.LoadAssetAsync("Audio/bgMusic.mp3"); - - ... - - // 卸载资源 - handle.Release(); -} -```` \ No newline at end of file +## 代码教程 +**1. 初始化** +**2. 资源更新** +**3. 资源加载**