05-03-源码-运行模式体系(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 的架构

scss 复制代码
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 的初始化参数

csharp 复制代码
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 的实现

csharp 复制代码
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 目录中加载:

csharp 复制代码
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 的实现

csharp 复制代码
public class OfflinePlayModeImpl : IPlayModeImpl
{
    public override void OnCreate()
    {
        // 1. 初始化 BuildinFileSystem
        InitBuildinFileSystem();
        
        // 2. 加载 PackageManifest
        LoadPackageManifest();
    }
}

BuildinFileSystem 初始化详解:

Offline 模式只初始化 BuildinFileSystem,资源从构建内文件加载。

加载 Manifest 详解:

从构建内路径加载 PackageManifest。

4.3 Offline 的资源加载

在 Offline 模式下,资源从构建内文件加载:

csharp 复制代码
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 的实现

csharp 复制代码
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 中加载:

csharp 复制代码
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 的热更新

csharp 复制代码
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 的实现

csharp 复制代码
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 模式下,资源从远程服务器加载:

csharp 复制代码
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:

csharp 复制代码
public class CustomPlayModeImpl : IPlayModeImpl
{
    public override void OnCreate()
    {
        // 自定义初始化逻辑
    }
    
    public override byte[] ReadFile(string filePath)
    {
        // 自定义文件读取逻辑
    }
}

自定义 IPlayModeImpl 详解:

开发者可以实现 IPlayModeImpl 接口,自定义 PlayMode 的所有行为。

使用方式详解:

csharp 复制代码
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) 下一篇 :寻址系统

相关推荐
努力小陈11 天前
Redis ZSet 排行榜实战:SLG 后端排行榜的 10 个坑
游戏开发
努力小陈11 天前
SLG 后端最终选了 Actor
游戏开发
努力小陈11 天前
玩家 Actor 的生命周期与阻塞 IO:全局协程池分流实战
游戏开发
SmalBox1 天前
05-02-源码-全局入口与包管理(YooAssets & ResourcePackage)
unity3d·游戏开发
SmalBox2 天前
05-01-源码-运行时总览
unity3d·游戏开发
SmalBox3 天前
04-06-源码-调试与扫描工具
unity3d·游戏开发
RobinDevNotes4 天前
一套代码发布到十几个平台:Cocos入门速览
typescript·c#·游戏开发
应用市场4 天前
离线小游戏做“每日挑战”:日期当随机种子,整局存成 JSON,再加一个“我不是机器人”
android·kotlin·游戏开发
用户2788607285674 天前
战争雷霆换区记录:字段里的「未知」不能写成正常
网络协议·游戏开发