尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

05-03-YooAsset源码-Unity运行模式体系(PlayMode)
📅 发布时间:2026/7/15 5:40:15

源码-运行模式体系(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)
下一篇:寻址系统

相关新闻

  • Spring IOC 控制反转
  • 万亿后市场的“油转电”:2026年,传统汽修厂如何接住新能源的“三电维修”红利?
  • 05-04-YooAsset源码-Unity资源定位系统

最新新闻

  • 车载视觉系统长距离视频传输:TI DS90UH940N-Q1解串器原理与应用
  • C++编译错误深度解析:从“未声明的标识符”到工程化实践
  • Android-基础-RTC、NTP​ 和 System Time(系统时间)
  • HarmonyOS菜谱——分类页面的筛选逻辑与路由传参
  • 鸿蒙打包、签名、加固、上架全流程实战(商用 APP 上线终极教程)
  • 为什么 Python 的简单越到工程里越贵?

日新闻

  • 告别启动盘残留:用Diskpart彻底清除U盘EFI分区与恢复完整空间
  • 2026 年宜春诚信的塑料缠绕膜厂家哪个好,缠绕膜背后的秘密:你不知道的成本陷阱 - 领域鉴赏官
  • Arch ECS 入门指南:10分钟掌握C#高性能数据驱动架构

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号