当前位置: 首页 > news >正文

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)
下一篇:寻址系统

http://www.jsqmd.com/news/1191725/

相关文章:

  • 端到端实时语音同传系统:3秒延迟与0样本声音复刻技术解析
  • 主流嵌入式处理器架构深度解析:从ARM到RISC-V的演进与选型
  • Agent如何真正‘看见’网页:Playwright与Puppeteer实战指南
  • Go面试官:如何设计百万级别的消息推送系统?
  • Spring IOC 控制反转
  • Rage(PC) Modding Notes Rage模组制作 指南 二
  • 万亿后市场的“油转电”:2026年,传统汽修厂如何接住新能源的“三电维修”红利?
  • C++从零解析SHP文件:手写GIS引擎核心,告别GDAL依赖
  • Unity UI粒子渲染性能优化:从RenderTexture到ECS的三大实战技巧
  • C++并发编程:深入理解std::atomic原子操作原理与实战应用
  • C# async、await异步语法 +Async+Task实现斐波那契数列渲染案例
  • 05-04-YooAsset源码-Unity资源定位系统
  • UE5 Niagara系统实战:从零打造动态烟雾特效的完整指南
  • 探秘ARM Cortex-M系列架构——从M0到M7的演进与选型
  • 国科GK7205V300替代海思HI3516EV300:从硬件兼容到软件迁移的完整指南
  • DS90UB662-Q1多路视频流合并:CSI-2转发模式详解与工程实践
  • Cluade 必备技能 Code-Simplifier
  • 【Java踩坑笔记】44_数据库字段用保留字,MyBatis生成的SQL直接报错
  • 【ChatGPT定价策略深度解密】:20年SaaS产品老兵拆解OpenAI 5次调价背后的成本模型、客户分层与ARPU阈值
  • 五次方程的OSOS结构识别与三次枢纽方程剥离方法
  • 从标准到应用:AVS3与H.265/HEVC视频编解码技术深度对比
  • 【Redis八股|第10篇】Spring Boot 项目整合 Redis 实战
  • C++跨平台剪贴板操作:纯头文件实现与多系统API详解
  • 从《论新阶段》到“活的灵魂”:毛泽东思想核心要义与当代技术创新的思想启迪
  • C++ WinInet实现高效HTTP文件下载:断点续传与多线程优化
  • 2026年7月最新嘉兴美度官方售后客服电话及服务网点地址查询 - 亨得利钟表维修中心
  • WorkBuddy 连接百度网盘:能查能上传,但别指望 AI 帮你下载
  • AWR1843BOOST毫米波雷达在自动泊车系统中的优势与实现
  • 影刀RPA 影刀中的SQL查询大全:从简单查询到多表联查
  • Midscene.js框架(5):测试报告系统与调试技巧