07-03-打包系统-资源变体与多平台适配

核心技术-资源组织与依赖

篇章 :07-核心技术-资源打包系统 阅读时间 :约 25 分钟 前置知识:了解打包策略


一、引言

本章将深入解析 YooAsset 资源组织与依赖管理。合理的资源组织可以提高打包效率、减小包体大小、加快加载速度。依赖管理是资源组织的核心,深入理解依赖管理有助于避免循环依赖、减少冗余打包。

YooAsset 提供了多种资源组织方式和强大的依赖分析能力。本章将详细解析资源组织和依赖管理的最佳实践。


二、资源分组策略

2.1 分组原则

合理的资源分组是打包策略的基础:

按功能分组:

将同一功能的资源放在同一目录或 Collector 下。

csharp 复制代码
// UI 模块
var uiCollector = new AssetBundleCollector
{
    CollectPath = "Assets/UI",
    GroupName = "UI",
};

// 角色模块
var characterCollector = new AssetBundleCollector
{
    CollectPath = "Assets/Characters",
    GroupName = "Characters",
};

按加载时机分组:

将同一加载时机的资源放在同一 Collector。

按更新频率分组:

将不同更新频率的资源放在不同 Collector。

2.2 分组粒度

分组粒度需要权衡:

过粗的分组:

  • Bundle 过大
  • 加载不灵活
  • 资源浪费

过细的分组:

  • Bundle 数量过多
  • 依赖关系复杂
  • 管理困难

推荐的分组粒度:

  • 单个 Bundle 不超过 50MB
  • 单个 Collector 包含 10-100 个资源
  • 按功能模块划分

2.3 共享资源分组

共享资源需要特殊处理:

共享资源识别:

被多个模块引用的资源应识别为共享资源。

共享资源处理:

csharp 复制代码
// 共享资源
var sharedCollector = new AssetBundleCollector
{
    CollectPath = "Assets/Shared",
    GroupName = "Shared",
    PackRuleType = ECollectorPackRuleType.Directory,
    IsShared = true, // 标识为共享资源
};

三、资源标签

3.1 Tag 的作用

资源标签是灵活的分类方式:

Tag 的应用:

  • 批量加载:通过 Tag 批量加载资源
  • 资源分类:按 Tag 分类管理
  • 资源筛选:按 Tag 筛选资源

3.2 Tag 的设置

csharp 复制代码
// 在 Collector 中设置
var uiCollector = new AssetBundleCollector
{
    CollectPath = "Assets/UI",
    AssetTags = new List<string> { "ui", "critical" },
};

// 在资源上设置
[AssetTag("ui_login")]
public class LoginPanel : MonoBehaviour
{
    // ...
}

Collector 级别 Tag:

Collector 中的所有资源都自动带有该 Tag。

资源级别 Tag:

通过自定义特性为单个资源设置 Tag。

3.3 Tag 的使用

csharp 复制代码
// 通过 Tag 加载资源
var handle = package.LoadAssetsByTagAsync<GameObject>("ui", callback);
foreach (var asset in handle.AllAssets)
{
    Instantiate(asset);
}
handle.Release();

批量加载详解:

通过 Tag 可以一次加载多个相关资源。

使用场景详解:

  • 加载某个关卡的所有资源
  • 加载某个角色的所有资源
  • 加载某个 UI 界面的所有资源

四、平台差异

4.1 平台差异概述

不同平台有特定的资源差异:

纹理压缩:

平台 推荐格式
iOS ASTC、PVRTC
Android ETC2、ASTC
Windows DXT5、BC7
WebGL DXT5、ETC2

音频格式:

  • iOS:ACC
  • Android:OGG、Vorbis
  • WebGL:OGG、MP3

视频格式:

  • 各平台支持的视频格式不同

4.2 平台资源处理

YooAsset 自动按目标平台处理资源:

自动处理:

YooAsset 构建时自动选择目标平台的资源格式。

多格式资源:

csharp 复制代码
// Resources/Textures/
//   texture.png  // 原始 PNG
//   texture@2x.png  // 高分辨率版本
//   texture@ios.astc  // iOS ASTC
//   texture@android.etc2  // Android ETC2

YooAsset 自动选择:

构建时根据目标平台自动选择合适的资源。

4.3 平台特定配置

csharp 复制代码
// 平台特定构建参数
public class BuildParameters
{
    public BuildTarget BuildTarget;
    public Compression Compression;
    public bool EnableEncryption;
}

平台特定优化:

针对不同平台设置不同的优化选项。


五、依赖管理

5.1 依赖分析

依赖分析是 YooAsset 的核心功能:

依赖类型:

  • 直接依赖:A 引用 B
  • 间接依赖:A 引用 C,C 引用 B
  • 循环依赖:A → B → A(应避免)

依赖分析工具:

  • AssetBundle Browser
  • YooAsset Asset Scanner

依赖图可视化:

YooAsset Debugger 提供依赖图可视化。

5.2 依赖优化

避免循环依赖:

循环依赖会导致构建失败,需要重构资源结构。

减少依赖深度:

减少资源之间的依赖层级,加快加载速度。

共享依赖:

将共享资源提取为共享 Bundle。

5.3 依赖加载策略

csharp 复制代码
// 同步加载
var handle = package.LoadAssetAsync<GameObject>("prefab");
yield return handle;
Instantiate(handle.AssetObject);

// 预加载依赖
var preloadOp = package.PreloadDependenciesAsync("prefab");
yield until preloadOp.IsDone;

预加载依赖:

在加载主资源前预加载所有依赖,避免加载卡顿。

分批加载:

将资源加载分散到多帧,避免单帧卡顿。


六、依赖管理实战

6.1 依赖分析示例

csharp 复制代码
// 分析 UI 资源的依赖
var dependencies = package.AnalyzeDependencies("ui/login_panel");
// dependencies 包含所有依赖的 Bundle

foreach (var bundle in dependencies)
{
    Debug.Log($"依赖 Bundle: {bundle.BundleName}");
}

依赖查询详解:

通过资源地址查询所有依赖的 Bundle。

6.2 共享资源提取

csharp 复制代码
// 提取共享资源
var sharedResources = package.ExtractSharedResources(assets);
foreach (var shared in sharedResources)
{
    Debug.Log($"共享资源: {shared.AssetPath}");
}

共享资源识别详解:

自动识别被多个 Bundle 引用的资源。

6.3 循环依赖检测

csharp 复制代码
// 检测循环依赖
var cycles = package.DetectDependencyCycles();
if (cycles.Count > 0)
{
    foreach (var cycle in cycles)
    {
        Debug.LogError($"循环依赖: {string.Join(" -> ", cycle)}");
    }
}

循环依赖检测详解:

使用图算法检测依赖图中的循环。

6.4 依赖优化工具

csharp 复制代码
// 优化建议
var suggestions = package.GetOptimizationSuggestions();
foreach (var suggestion in suggestions)
{
    Debug.Log($"优化建议: {suggestion}");
}

优化建议详解:

YooAsset 提供优化建议,如拆分过大 Bundle、合并过小 Bundle、提取共享资源等。


七、总结

本章深入解析了 YooAsset 资源组织与依赖管理,包括:

  • 资源分组策略:分组原则、粒度、共享资源分组
  • 资源标签:Tag 的作用、设置、使用
  • 平台差异:平台差异概述、平台资源处理、平台特定配置
  • 依赖管理:依赖分析、依赖优化、依赖加载策略
  • 依赖管理实战:依赖分析、共享资源提取、循环依赖检测、优化工具

通过合理的资源组织和依赖管理,可以提高打包效率、减小包体大小、加快加载速度、避免资源冲突。


下一篇 :热更新-版本管理

相关推荐
呆呆敲代码的小Y9 小时前
【实战精选面试题】C# 面试题详细解答,按难易程度排序
android·java·游戏·c#·游戏开发·unity面试题·c#面试题
ZzT11 小时前
vibe coding 做小游戏·打包篇:发 Mac 试玩包、查启动慢,和一次 AI 自己改出来的崩溃
ai编程·游戏开发
应用市场13 小时前
用本机跑的开源音乐模型,给安卓小游戏做 20 秒无缝循环背景音乐
android·python·游戏开发·soundpool·音频处理
SmalBox1 天前
07-02-打包系统-压缩与加密策略
unity3d·游戏开发
Aman19841 天前
Claude Code做Unity项目移植(一):从零散工具到团队式
unity·游戏开发·vibe coding·claude code·项目迁移
ZzT1 天前
vibe coding 做小游戏·玩法篇:8 句试玩反馈,变成无限关卡、局外成长和援军登场
ai编程·游戏开发
ZzT2 天前
vibe coding 做小游戏·素材篇:Claude Code 操作网页版 ChatGPT,一个对话画完全套美术
ai编程·游戏开发
SmalBox3 天前
07-01-打包系统-资源分组策略
unity3d·游戏开发
ZzT3 天前
vibe coding 做小游戏·开工篇:5 天、8400 行代码一行没手写,先让 AI 能检查自己
ai编程·游戏开发·claude