淡海水头像
关注
05-01-YooAsset源码-Unity运行时总览封面图

05-01-YooAsset源码-Unity运行时总览

源码-运行时总览

篇章:05-源码深度-运行时核心模块
阅读时间:约 25 分钟
前置知识:了解 YooAsset 基础概念


一、引言

本章将深入解析 YooAsset 运行时端的整体代码结构和模块组织。YooAsset 的运行时端代码位于 YooAsset/Runtime/ 目录下,是 YooAsset 框架在游戏运行时执行的核心部分。运行时端的设计目标是为游戏提供高效、灵活、可靠的资源管理能力。

YooAsset 运行时端采用了清晰的分层架构和模块化设计,包含了从全局入口到资源管理的完整实现。本章将深入解析运行时端的整体架构。


二、运行时端代码结构

2.1 目录结构

YooAsset 运行时端的代码结构如下:

YooAsset/Runtime/
├── Core/                    # 核心基础
├── YooAssets.cs             # 全局入口
├── Package/                 # 资源包
├── PlayModeImpl/            # 运行模式
├── AssetInfo/               # 资源信息
├── Provider/                # 资源提供者
├── OperationSystem/         # 异步操作系统
├── FileSystem/              # 文件系统
├── Download/                # 下载系统
├── Cache/                   # 缓存系统
└── Manifest/                # Manifest 处理

Core 目录:

核心基础模块,包含了运行时的核心类、扩展方法、工具类等。

YooAssets.cs:

YooAssets 是 YooAsset 的全局静态入口,提供了统一的 API 让开发者与 YooAsset 进行交互。

Package 目录:

ResourcePackage 相关的类,封装了一组相关资源的加载、卸载和管理。

PlayModeImpl 目录:

运行模式实现,包含了 EditorSimulate、Offline、Host、Web、Custom 等多种运行模式的实现。

AssetInfo 目录:

AssetInfo 和 BundleInfo 等信息类,描述了资源和 Bundle 的元信息。

Provider 目录:

资源提供者(Provider)相关的类,封装了资源加载的具体逻辑。

OperationSystem 目录:

异步操作系统,提供了统一的异步操作管理。

FileSystem 目录:

文件系统抽象,提供了跨平台的文件访问能力。

Download 目录:

下载系统,负责资源的下载和热更新。

Cache 目录:

缓存系统,负责本地缓存的管理。

Manifest 目录:

Manifest 处理,提供了 Manifest 的序列化和反序列化能力。

2.2 模块职责

YooAsset 运行时端的各个模块职责清晰:

模块职责核心类
Core核心基础AssetInfo, BundleInfo
YooAssets全局入口YooAssets
Package资源包ResourcePackage
PlayModeImpl运行模式EditorSimulateModeImpl, HostPlayModeImpl
Provider资源提供者AssetProvider, SceneProvider
OperationSystem异步操作系统AsyncOperationBase, OperationSystem
FileSystem文件系统IFileSystem, DefaultCacheFileSystem
Download下载系统DownloadManager, BundleDownloader
Cache缓存系统CacheSystem
ManifestManifest 处理PackageManifest, ManifestTools

Core 详解:

Core 模块提供了运行时的核心基础,包括数据类、工具类、扩展方法等。

YooAssets 详解:

YooAssets 是全局静态入口,提供了统一的 API。

Package 详解:

Package 模块是 ResourcePackage 的实现,封装了资源包的所有功能。

PlayModeImpl 详解:

PlayModeImpl 模块提供了多种运行模式实现,开发者可以根据需要选择合适的运行模式。

Provider 详解:

Provider 模块是资源加载的核心,封装了不同类型资源的加载逻辑。

OperationSystem 详解:

OperationSystem 模块是异步操作的核心,提供了统一的异步操作管理。

FileSystem 详解:

FileSystem 模块是文件系统的抽象,提供了跨平台的文件访问能力。

Download 详解:

Download 模块负责资源下载和热更新。

Cache 详解:

Cache 模块负责本地缓存管理。

Manifest 详解:

Manifest 模块处理 PackageManifest 的序列化和反序列化。


三、初始化流程

3.1 初始化流程概述

YooAsset 的初始化流程如下:

YooAssets.InitializeAsync() → 加载 Manifest → 初始化 FileSystem 
→ 初始化 OperationSystem → 启动监听 → 完成

加载 Manifest 详解:

初始化时首先加载 PackageManifest 文件。PackageManifest 包含了所有 Bundle 的信息。

初始化 FileSystem 详解:

初始化 FileSystem,根据运行模式选择合适的 FileSystem 实现。

初始化 OperationSystem 详解:

初始化 OperationSystem,准备异步操作管理。

启动监听详解:

启动必要的监听器,如下载监听、缓存清理监听等。

3.2 初始化详细步骤

YooAsset 初始化的详细步骤:

  1. 创建 YooAssets 单例
  2. 加载 Manifest 文件
  3. 初始化 FileSystem(构建内、缓存、Web 等)
  4. 初始化 OperationSystem
  5. 启动后台任务
  6. 返回 AsyncOperationHandle

创建 YooAssets 单例详解:

YooAssets 是全局静态入口,通过 Initialize 方法创建单例。

加载 Manifest 文件详解:

从指定位置加载 PackageManifest 文件,可以是本地或远程。

初始化 FileSystem 详解:

根据运行模式初始化 FileSystem。EditorSimulate 模式使用 DefaultBuildinFileSystem,Host 模式使用 DefaultBuildinFileSystem + DefaultCacheFileSystem + DefaultWebServerFileSystem。

初始化 OperationSystem 详解:

创建 OperationSystem 实例,启动 OperationUpdater 监听器。

启动后台任务详解:

启动缓存清理、版本检查等后台任务。

3.3 初始化涉及的核心类

初始化涉及以下核心类:

  • PlayMode:运行模式,封装了 YooAsset 的运行模式
  • FileSystem:文件系统,封装了文件访问逻辑
  • CacheSystem:缓存系统,封装了缓存管理逻辑
  • OperationSystem:异步操作系统,封装了异步操作管理

PlayMode 详解:

PlayMode 是运行模式的核心类,封装了 YooAsset 在特定模式下的行为。

FileSystem 详解:

FileSystem 是文件系统的抽象,提供了跨平台的文件访问。

CacheSystem 详解:

CacheSystem 是缓存系统的核心,提供了本地缓存的管理。

OperationSystem 详解:

OperationSystem 是异步操作系统的核心,提供了统一的异步操作管理。


四、核心接口

4.1 IResourcePackage

IResourcePackage 是 ResourcePackage 的接口:

public interface IResourcePackage
{
    string PackageName { get; }
    bool IsInitializeSucceed { get; }
    
    AssetInfo GetAssetInfo(string location);
    BundleInfo GetBundleInfo(string bundleName);
    bool IsNeedDownload();
    
    AssetOperationHandle LoadAssetAsync<T>(string location);
    SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode);
    SubAssetsOperationHandle LoadSubAssetsAsync<T>(string location);
    RawFileOperationHandle LoadRawFileAsync(string location);
    
    void UnloadAsset(AssetOperationHandle handle);
    void UnloadScene(SceneOperationHandle handle);
    void Release();
}

PackageName 详解:

PackageName 是 Package 的唯一标识符。

GetAssetInfo 详解:

通过 location 获取 AssetInfo,包括资源的 Bundle、依赖等信息。

LoadAssetAsync 详解:

异步加载资源,返回 AssetOperationHandle。

LoadSceneAsync 详解:

异步加载场景,返回 SceneOperationHandle。

4.2 IResourceManager

IResourceManager 是 ResourceManager 的接口:

public interface IResourceManager
{
    AssetInfo GetAssetInfo(string location);
    BundleInfo GetBundleInfo(string bundleName);
    
    AssetOperationHandle LoadAssetAsync(string location, Type assetType);
    SceneOperationHandle LoadSceneAsync(string location, LoadSceneParameters loadSceneParameters);
    
    void UnloadAsset(AssetOperationHandle handle);
    void UnloadScene(SceneOperationHandle handle);
    
    void ClearAllAssets();
    void ClearUnusedAssets();
}

GetAssetInfo 详解:

通过 location 获取 AssetInfo。

LoadAssetAsync 详解:

异步加载指定类型的资源。

ClearAllAssets 详解:

清除所有已加载的资源。

ClearUnusedAssets 详解:

清除未被引用的资源。

4.3 IProvider

IProvider 是 Provider 的接口:

public interface IProvider
{
    string Location { get; }
    EProviderStatus Status { get; }
    float Progress { get; }
    object AssetObject { get; }
    
    void Provide();
    void UnProvide();
    void Update();
}

Location 详解:

Location 是 Provider 加载的资源地址。

Status 详解:

Status 是 Provider 的状态,包括 None、Loading、Loaded、Destroyed 等。

Progress 详解:

Progress 是 Provider 的加载进度,范围 0-1。

AssetObject 详解:

AssetObject 是 Provider 加载的资源对象。

4.4 IAsyncOperation

IAsyncOperation 是异步操作的接口:

public interface IAsyncOperation
{
    EAsyncOperationStatus Status { get; }
    float Progress { get; }
    string Error { get; }
    bool IsDone { get; }
    
    event Action<IAsyncOperation> OnCompleted;
    
    void Update();
    void Cancel();
    void Destroy();
}

Status 详解:

Status 是异步操作的状态,包括 Pending、Running、Succeeded、Failed、Cancelled。

Progress 详解:

Progress 是异步操作的进度。

OnCompleted 详解:

OnCompleted 是异步操作完成时触发的事件。


五、运行时关键类

5.1 YooAssets

YooAssets 是 YooAsset 的全局静态入口:

public static class YooAssets
{
    public static ResourcePackage CreatePackage(string packageName);
    public static bool InitPackage(ResourcePackage package);
    public static void DestroyPackage(ResourcePackage package);
    public static ResourcePackage GetPackage(string packageName);
    public static void SetDefaultPackage(ResourcePackage package);
    public static ResourcePackage GetDefaultPackage();
}

CreatePackage 详解:

创建一个 ResourcePackage 对象。

InitPackage 详解:

初始化 ResourcePackage,包括加载 Manifest、初始化 FileSystem 等。

SetDefaultPackage 详解:

设置默认 Package,使用 ResourcePackage.DefaultPackage 加载资源时使用此 Package。

5.2 ResourcePackage

ResourcePackage 是资源包的核心类:

public class ResourcePackage
{
    public string PackageName { get; }
    public bool IsInitializeSucceed { get; }
    public PackageManifest Manifest { get; }
    public IFileSystem BuildinFileSystem { get; }
    public IFileSystem CacheFileSystem { get; }
    public IFileSystem DeliveryFileSystem { get; }
    public IPlayModeImpl PlayModeImpl { get; }
    public ResourceManager ResourceManager { get; }
    public DownloadManager DownloadManager { get; }
    public CacheSystem CacheSystem { get; }
}

PackageName 详解:

PackageName 是 Package 的唯一标识符。

Manifest 详解:

Manifest 是 Package 的清单文件。

BuildinFileSystem 详解:

BuildinFileSystem 是构建内文件系统,管理包内资源。

CacheFileSystem 详解:

CacheFileSystem 是缓存文件系统,管理本地缓存。

PlayModeImpl 详解:

PlayModeImpl 是运行模式实现,根据不同的运行模式提供不同的行为。

5.3 ResourceManager

ResourceManager 是资源管理器的核心类:

public class ResourceManager
{
    public Dictionary<string, ProviderBase> ProviderCache { get; }
    public Dictionary<string, BundleLoader> BundleLoaders { get; }
    
    public AssetOperationHandle LoadAssetAsync(string location, Type assetType);
    public SceneOperationHandle LoadSceneAsync(string location, LoadSceneParameters parameters);
    public void UnloadAsset(AssetOperationHandle handle);
    public void ClearAllAssets();
}

ProviderCache 详解:

ProviderCache 是 Provider 缓存,存储已创建的 Provider。

BundleLoaders 详解:

BundleLoaders 是 Bundle 加载器缓存,存储已创建的 Bundle 加载器。

LoadAssetAsync 详解:

异步加载资源,返回 AssetOperationHandle。

5.4 Provider

Provider 是资源加载的核心:

public abstract class ProviderBase
{
    public string Location { get; }
    public EProviderStatus Status { get; protected set; }
    public float Progress { get; protected set; }
    public object AssetObject { get; protected set; }
    public int RefCount { get; protected set; }
    
    public abstract void Provide();
    public abstract void UnProvide();
    public abstract void Update();
}

Location 详解:

Location 是 Provider 加载的资源地址。

Status 详解:

Status 是 Provider 的状态。

RefCount 详解:

RefCount 是 Provider 的引用计数。


六、运行时数据流

6.1 资源加载数据流

资源加载数据流
用户调用 LoadAssetAsync → YooAssets 接收 → 转发到 ResourcePackage 
→ ResourceManager 查找 Provider → 创建/复用 Provider 
→ Provider 加载 Bundle → 加载资源 → 返回 Handle

YooAssets 接收详解:

YooAssets 接收用户的资源加载请求。

ResourcePackage 处理详解:

ResourcePackage 接收请求后,通过 Manifest 查找资源的 Bundle 和依赖。

ResourceManager 处理详解:

ResourceManager 查找或创建 Provider。

Provider 加载详解:

Provider 加载 Bundle,然后从 Bundle 中加载资源。

6.2 Bundle 加载数据流

Bundle 加载数据流
Provider 请求加载 Bundle → BundleLoader 创建 → FileSystem 读取文件 
→ 解析 AssetBundle → 缓存 → 完成

BundleLoader 创建详解:

BundleLoader 负责加载 Bundle 文件。

FileSystem 读取文件详解:

FileSystem 从指定位置读取文件(本地或远程)。

解析 AssetBundle 详解:

使用 Unity 的 AssetBundle API 解析 AssetBundle。

6.3 资源卸载数据流

资源卸载数据流
用户调用 UnloadAsset → YooAssets 接收 → 转发到 ResourcePackage 
→ ResourceManager 减少引用计数 → Provider 减少引用 → 
引用为 0 时销毁 Provider → 引用为 0 时销毁 Bundle

引用计数减少详解:

每次 UnloadAsset 调用会减少 Provider 和 Bundle 的引用计数。

销毁 Provider 详解:

当 Provider 的引用计数为 0 时,Provider 会被销毁。

销毁 Bundle 详解:

当 Bundle 的引用计数为 0 时,Bundle 会被销毁。


七、总结

本章深入解析了 YooAsset 运行时端的整体代码结构和核心类,包括:

  • 目录结构:Core、YooAssets、Package、PlayModeImpl、Provider、OperationSystem 等
  • 初始化流程:从 YooAssets.InitializeAsync 到完成的完整流程
  • 核心接口:IResourcePackage、IResourceManager、IProvider、IAsyncOperation
  • 关键类:YooAssets、ResourcePackage、ResourceManager、Provider
  • 数据流:资源加载、Bundle 加载、资源卸载的数据流

通过深入理解运行时端的整体架构,可以更好地理解 YooAsset 的工作原理,为后续深入学习各个模块打下基础。


上一篇:调试与诊断工具
下一篇:全局入口与资源包(YooAssets & ResourcePackage)

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/chenghai37/article/details/162686075

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--