05-03-YooAsset源码-Unity运行模式体系(PlayMode)

发布时间:2026/7/15 5:32:10
05-03-YooAsset源码-Unity运行模式体系(PlayMode) 源码-运行模式体系PlayMode篇章05-源码深度-运行时核心模块阅读时间约 25 分钟前置知识了解 YooAssets 和 ResourcePackage一、引言本章将深入解析 YooAsset 运行模式体系PlayMode的源码实现。PlayMode 是 YooAsset 在不同场景下的运行模式支持 EditorSimulate、Offline、Host、Web、Custom 等多种模式。PlayMode 设计的目标是让开发者可以在不同环境下灵活切换 YooAsset 的行为。PlayMode 的设计体现了 YooAsset 的灵活性开发者可以根据开发、测试、生产等不同阶段选择合适的运行模式。本章将从源码层面深入解析 PlayMode 体系。二、PlayMode 概述2.1 PlayMode 的概念PlayMode 是 YooAsset 的运行模式决定了 YooAsset 在特定环境下的行为PlayMode 的作用决定资源从何处加载本地、远程、模拟决定是否支持热更新决定文件系统的组合方式决定 Manifest 的加载方式PlayMode 的类型YooAsset 支持以下 PlayModeEditorSimulateMode编辑器模拟模式OfflinePlayMode离线模式HostPlayMode联机模式WebPlayModeWeb 模式CustomPlayMode自定义模式2.2 PlayMode 的架构PlayMode 架构 ├── IPlayMode接口 │ ├── InitPlayMode()初始化 │ ├── OnDestroy()销毁 │ ├── UpdatePackageVersionAsync()更新版本 │ ├── UpdatePackageManifestAsync()更新清单 │ ├── LoadPackageManifest()加载清单 │ └── 其他方法 └── IPlayModeImpl实现 ├── EditorSimulateModeImpl ├── OfflinePlayModeImpl ├── HostPlayModeImpl ├── WebPlayModeImpl └── CustomPlayModeImplIPlayMode 接口详解IPlayMode 是 PlayMode 的接口定义了 PlayMode 的基本行为。IPlayModeImpl 实现详解IPlayModeImpl 是 PlayMode 的实现抽象基类具体的 PlayMode 继承自 IPlayModeImpl。2.3 PlayMode 的初始化参数public abstract class PlayModeImplParameters { public IBuildinQueryServices BuildinQueryServices; public IDeliveryQueryServices DeliveryQueryServices; public IRemoteServices RemoteServices; public ICacheSystem CacheSystem; public IBuildinFileSystemParameter BuildinFileSystemParameter; public IDeliveryFileSystemParameter DeliveryFileSystemParameter; public ICacheFileSystemParameter CacheFileSystemParameter; }BuildinQueryServices 详解BuildinQueryServices 用于查询构建内资源。DeliveryQueryServices 详解DeliveryQueryServices 用于查询远端资源。RemoteServices 详解RemoteServices 用于与远端服务器通信。CacheSystem 详解CacheSystem 是缓存系统实现。三、EditorSimulate 模式3.1 EditorSimulate 概述EditorSimulate 模式用于在 Unity Editor 中模拟 YooAsset 的行为特点只在 Unity Editor 中可用不需要实际打包直接读取项目中的资源加快开发迭代速度使用场景开发阶段的资源调试资源加载的快速验证性能调优3.2 EditorSimulate 的实现public class EditorSimulateModeImpl : IPlayModeImpl { public override void OnCreate() { // 1. 获取构建报告 var buildResult EditorSimulateBuildHelper.GetBuildResult(); // 2. 加载 PackageManifest LoadPackageManifest(buildResult.PackageManifest); } public override void OnDestroy() { // 清理资源 } }获取构建报告详解EditorSimulate 模式通过 EditorSimulateBuildHelper 获取构建报告。构建报告是模拟构建的结果。加载 Manifest 详解从构建报告中加载 PackageManifest。Manifest 包含了模拟构建的所有信息。3.3 EditorSimulate 的资源加载在 EditorSimulate 模式下资源直接从项目 Asset 目录中加载public override AssetBundle LoadAssetBundle(string bundleName) { string assetBundlePath $Assets/Bundles/{bundleName}; return AssetDatabase.LoadAssetAtPathAssetBundle(assetBundlePath); }AssetDatabase 加载详解EditorSimulate 模式使用 AssetDatabase 加载资源而不是 AssetBundle。优势详解直接使用 AssetDatabase 加载资源可以避免 AssetBundle 加载的开销加快开发迭代。四、Offline 模式4.1 Offline 概述Offline 模式用于离线运行 YooAsset特点资源从构建内文件加载不支持热更新不需要远程服务器适合单机游戏使用场景单机游戏内购游戏不需要热更新的场景4.2 Offline 的实现public class OfflinePlayModeImpl : IPlayModeImpl { public override void OnCreate() { // 1. 初始化 BuildinFileSystem InitBuildinFileSystem(); // 2. 加载 PackageManifest LoadPackageManifest(); } }BuildinFileSystem 初始化详解Offline 模式只初始化 BuildinFileSystem资源从构建内文件加载。加载 Manifest 详解从构建内路径加载 PackageManifest。4.3 Offline 的资源加载在 Offline 模式下资源从构建内文件加载public override byte[] ReadFile(string filePath) { string fullPath Path.Combine(_buildinRootPath, filePath); if (File.Exists(fullPath)) return File.ReadAllBytes(fullPath); return null; }构建内路径详解构建内路径是 Unity 的 StreamingAssets 路径或自定义路径。文件读取详解使用 File.ReadAllBytes 从构建内文件读取 Bundle 文件。五、Host 模式5.1 Host 概述Host 模式是 YooAsset 最常用的运行模式特点资源从构建内文件加载支持热更新资源从远程服务器下载适合联机游戏使用场景联机游戏需要热更新的游戏大型游戏5.2 Host 的实现public class HostPlayModeImpl : IPlayModeImpl { public override void OnCreate() { // 1. 初始化 BuildinFileSystem InitBuildinFileSystem(); // 2. 初始化 CacheFileSystem InitCacheFileSystem(); // 3. 初始化 DeliveryFileSystem InitDeliveryFileSystem(); // 4. 加载 PackageManifest LoadPackageManifest(); } }多 FileSystem 初始化详解Host 模式同时初始化 BuildinFileSystem、CacheFileSystem、DeliveryFileSystem。FileSystem 优先级详解资源查找的优先级是 Buildin Cache Delivery。5.3 Host 的资源加载在 Host 模式下资源从多个 FileSystem 中加载public override byte[] ReadFile(string filePath) { // 1. 优先从 Buildin 加载 var data BuildinFileSystem.ReadFile(filePath); if (data ! null) return data; // 2. 然后从 Cache 加载 data CacheFileSystem.ReadFile(filePath); if (data ! null) return data; // 3. 最后从 Delivery 加载 data DeliveryFileSystem.ReadFile(filePath); return data; }资源加载顺序详解资源按 Buildin → Cache → Delivery 的顺序加载。缓存机制详解从 Delivery 加载的资源会缓存到 Cache下次加载时直接从 Cache 读取。5.4 Host 的热更新public override UpdatePackageVersionOperation UpdatePackageVersionAsync() { // 1. 请求服务器版本 var request UnityWebRequest.Get(RemoteServices.GetVersionURL()); // 2. 解析服务器版本 // 3. 与本地版本比较 // 4. 返回最新版本 } public override UpdatePackageManifestOperation UpdatePackageManifestAsync(string packageVersion) { // 1. 请求服务器 Manifest var request UnityWebRequest.Get(RemoteServices.GetManifestURL(packageVersion)); // 2. 解析服务器 Manifest // 3. 与本地 Manifest 对比 // 4. 返回下载操作 }版本更新详解通过 RemoteServices 请求服务器的最新版本。Manifest 更新详解通过 RemoteServices 请求服务器的 Manifest下载差异 Bundle。六、Web 模式6.1 Web 概述Web 模式用于在 WebGL 平台运行 YooAsset特点资源从远程服务器加载没有本地文件缓存WebGL 限制适合 WebGL 平台不支持离线使用场景WebGL 游戏H5 游戏小游戏6.2 Web 的实现public class WebPlayModeImpl : IPlayModeImpl { public override void OnCreate() { // 1. 初始化 Web FileSystem InitWebFileSystem(); // 2. 加载 PackageManifest LoadPackageManifest(); } }Web FileSystem 初始化详解Web 模式只初始化 Web FileSystem没有本地缓存。加载 Manifest 详解从远程服务器加载 PackageManifest。6.3 Web 的资源加载在 Web 模式下资源从远程服务器加载public override byte[] ReadFile(string filePath) { string url RemoteServices.GetFileURL(filePath); var request UnityWebRequest.Get(url); request.SendWebRequest(); while (!request.isDone) { } if (request.result UnityWebRequest.Result.Success) return request.downloadHandler.data; return null; }远程加载详解使用 UnityWebRequest 从远程服务器加载资源。WebGL 限制详解WebGL 平台不支持本地文件缓存所有资源都需要从远程服务器加载。七、Custom 模式7.1 Custom 概述Custom 模式允许开发者自定义 YooAsset 的运行模式特点灵活的自定义能力可以实现特殊的业务需求适合有特殊需求的场景使用场景特殊的资源加载策略自定义的热更新逻辑与其他系统集成7.2 Custom 的实现开发者可以实现 IPlayModeImpl 接口来自定义 PlayModepublic class CustomPlayModeImpl : IPlayModeImpl { public override void OnCreate() { // 自定义初始化逻辑 } public override byte[] ReadFile(string filePath) { // 自定义文件读取逻辑 } }自定义 IPlayModeImpl 详解开发者可以实现 IPlayModeImpl 接口自定义 PlayMode 的所有行为。使用方式详解var package YooAssets.CreatePackage(MyPackage); var customImpl new CustomPlayModeImpl(); package.PlayModeImpl customImpl;7.3 Custom 的应用场景特殊资源加载从加密磁盘加载资源从 P2P 网络加载资源从内存数据库加载资源特殊热更新逻辑与游戏服务器集成走自己的 CDN走自己的验证流程与第三方系统集成与资产管理系统集成与数据分析系统集成与监控系统集成八、PlayMode 选择8.1 如何选择 PlayMode不同的 PlayMode 适用于不同的场景PlayMode适用场景优点缺点EditorSimulate编辑器调试不需要打包只能在 EditorOffline单机游戏简单、可靠不支持热更新Host联机游戏支持热更新需要服务器WebWebGL 游戏适合 WebGL依赖网络Custom特殊需求灵活需要自定义8.2 推荐的 PlayMode 选择开发阶段使用 EditorSimulate 模式加快开发迭代。测试阶段使用 Host 模式测试热更新功能。发布阶段根据目标平台选择移动端使用 Host 模式单机游戏使用 Offline 模式WebGL使用 Web 模式九、总结本章深入解析了 YooAsset 运行模式体系PlayMode的源码实现包括PlayMode 概述PlayMode 的概念、类型、架构EditorSimulate 模式编辑器模拟模式的实现Offline 模式离线模式的实现Host 模式联机模式的实现、热更新Web 模式WebGL 模式的实现Custom 模式自定义模式的实现PlayMode 体系是 YooAsset 灵活性的重要体现通过深入理解 PlayMode 体系开发者可以根据不同的场景选择合适的运行模式并实现自定义的运行模式。上一篇全局入口与资源包YooAssets ResourcePackage下一篇寻址系统