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.csYooAssets 是 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, BundleInfoYooAssets全局入口YooAssetsPackage资源包ResourcePackagePlayModeImpl运行模式EditorSimulateModeImpl, HostPlayModeImplProvider资源提供者AssetProvider, SceneProviderOperationSystem异步操作系统AsyncOperationBase, OperationSystemFileSystem文件系统IFileSystem, DefaultCacheFileSystemDownload下载系统DownloadManager, BundleDownloaderCache缓存系统CacheSystemManifestManifest 处理PackageManifest, ManifestToolsCore 详解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 初始化的详细步骤创建 YooAssets 单例加载 Manifest 文件初始化 FileSystem构建内、缓存、Web 等初始化 OperationSystem启动后台任务返回 AsyncOperationHandle创建 YooAssets 单例详解YooAssets 是全局静态入口通过 Initialize 方法创建单例。加载 Manifest 文件详解从指定位置加载 PackageManifest 文件可以是本地或远程。初始化 FileSystem 详解根据运行模式初始化 FileSystem。EditorSimulate 模式使用 DefaultBuildinFileSystemHost 模式使用 DefaultBuildinFileSystem DefaultCacheFileSystem DefaultWebServerFileSystem。初始化 OperationSystem 详解创建 OperationSystem 实例启动 OperationUpdater 监听器。启动后台任务详解启动缓存清理、版本检查等后台任务。3.3 初始化涉及的核心类初始化涉及以下核心类PlayMode运行模式封装了 YooAsset 的运行模式FileSystem文件系统封装了文件访问逻辑CacheSystem缓存系统封装了缓存管理逻辑OperationSystem异步操作系统封装了异步操作管理PlayMode 详解PlayMode 是运行模式的核心类封装了 YooAsset 在特定模式下的行为。FileSystem 详解FileSystem 是文件系统的抽象提供了跨平台的文件访问。CacheSystem 详解CacheSystem 是缓存系统的核心提供了本地缓存的管理。OperationSystem 详解OperationSystem 是异步操作系统的核心提供了统一的异步操作管理。四、核心接口4.1 IResourcePackageIResourcePackage 是 ResourcePackage 的接口public interface IResourcePackage { string PackageName { get; } bool IsInitializeSucceed { get; } AssetInfo GetAssetInfo(string location); BundleInfo GetBundleInfo(string bundleName); bool IsNeedDownload(); AssetOperationHandle LoadAssetAsyncT(string location); SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode); SubAssetsOperationHandle LoadSubAssetsAsyncT(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 IResourceManagerIResourceManager 是 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 IProviderIProvider 是 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 IAsyncOperationIAsyncOperation 是异步操作的接口public interface IAsyncOperation { EAsyncOperationStatus Status { get; } float Progress { get; } string Error { get; } bool IsDone { get; } event ActionIAsyncOperation OnCompleted; void Update(); void Cancel(); void Destroy(); }Status 详解Status 是异步操作的状态包括 Pending、Running、Succeeded、Failed、Cancelled。Progress 详解Progress 是异步操作的进度。OnCompleted 详解OnCompleted 是异步操作完成时触发的事件。五、运行时关键类5.1 YooAssetsYooAssets 是 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 ResourcePackageResourcePackage 是资源包的核心类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 ResourceManagerResourceManager 是资源管理器的核心类public class ResourceManager { public Dictionarystring, ProviderBase ProviderCache { get; } public Dictionarystring, 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 ProviderProvider 是资源加载的核心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 → 加载资源 → 返回 HandleYooAssets 接收详解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