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 └── CustomPlayModeImpl

IPlayMode 接口详解

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联机游戏支持热更新需要服务器
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)
下一篇:寻址系统