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 支持以下 PlayMode:
- EditorSimulateMode:编辑器模拟模式
- OfflinePlayMode:离线模式
- HostPlayMode:联机模式
- WebPlayMode:Web 模式
- 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.LoadAssetAtPath<AssetBundle>(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 接口来自定义 PlayMode:
public 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 | 编辑器调试 | 不需要打包 | 只能在 Editor |
| Offline | 单机游戏 | 简单、可靠 | 不支持热更新 |
| Host | 联机游戏 | 支持热更新 | 需要服务器 |
| Web | WebGL 游戏 | 适合 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)
下一篇:寻址系统
