跪拜 Guibai
← Back to the summary

YooAsset's Unity Asset Packaging Strategies: From Directory Packs to Shared Bundles

Core Technology - Resource Packaging Strategy

Chapter: 07 - Core Technology - Resource Packaging System Reading time: about 30 minutes Prerequisite: understanding of YooAsset basic concepts


I. Introduction

This chapter deeply analyzes YooAsset resource packaging strategies. Resource packaging is the core link of YooAsset resource management. A reasonable packaging strategy can significantly improve game performance, reduce package size, and speed up loading. Deeply understanding packaging strategies is key to using YooAsset well.

YooAsset provides flexible packaging rules and multiple packaging strategies. This chapter will analyze the principles, applicable scenarios, and best practices of these strategies in detail.


II. Packaging Basics

2.1 Bundle Size Control

Bundle size is an important factor in packaging strategy:

Bundle too large:

Bundle too small:

Recommended Bundle sizes:

2.2 Resource Classification

Reasonable resource classification is the foundation of packaging strategy:

By type:

By usage frequency:

By update frequency:


III. Packaging Strategies

3.1 Basic Packaging Strategies

Pack by directory:

Package all resources in the same directory into one Bundle.

// Pack entire UI directory
var uiCollector = new AssetBundleCollector
{
    CollectPath = "Assets/UI",
    PackRuleType = ECollectorPackRuleType.Directory,
};

Advantages:

Disadvantages:

Applicable scenarios:

Pack by Prefab:

Each Prefab is packed into a separate Bundle.

// Each UI Prefab packed separately
var prefabCollector = new AssetBundleCollector
{
    CollectPath = "Assets/UI/Prefabs",
    PackRuleType = ECollectorPackRuleType.Prefab,
};

Advantages:

Disadvantages:

Applicable scenarios:

3.2 Advanced Packaging Strategies

Dependency sharing packaging:

Extract resources shared by multiple modules into a shared Bundle.

// Shared resources
var sharedCollector = new AssetBundleCollector
{
    CollectPath = "Assets/Shared",
    PackRuleType = ECollectorPackRuleType.Directory,
};

// Business module
var moduleACollector = new AssetBundleCollector
{
    CollectPath = "Assets/ModuleA",
    PackRuleType = ECollectorPackRuleType.Directory,
    SharedPackRule = true, // share dependency resources
};

Advantages:

Disadvantages:

Applicable scenarios:

Layered packaging:

Pack resources by importance into layers.

// Core layer: required at startup
var coreCollector = new AssetBundleCollector
{
    CollectPath = "Assets/Core",
    PackRuleType = ECollectorPackRuleType.Directory,
    BundlePriority = 100, // highest priority
};

// Business layer: commonly used
var businessCollector = new AssetBundleCollector
{
    CollectPath = "Assets/Business",
    PackRuleType = ECollectorPackRuleType.Directory,
    BundlePriority = 50,
};

// Content layer: occasionally used
var contentCollector = new AssetBundleCollector
{
    CollectPath = "Assets/Content",
    PackRuleType = ECollectorPackRuleType.Directory,
    BundlePriority = 10,
};

Advantages:

Disadvantages:

Applicable scenarios:

3.3 Dynamic Packaging Strategies

Pack by tag:

Use tags to flexibly control resource assignment.

// Categorize by tag
var taggedAssets = assets
    .Where(a => a.HasTag("critical"))
    .ToList();

Advantages:

Disadvantages:

Pack by version:

Different versions pack different Bundles.

if (isStableVersion)
{
    // stable version packaging
}
else
{
    // test version packaging
}

Applicable scenarios:


IV. Dependency Management

4.1 Dependency Analysis

Dependency analysis is key to packaging strategy:

Dependency analysis tools:

Dependency relationships:

4.2 Shared Resource Handling

Shared resources are key to dependency management:

Shared Bundle:

// Extract shared resources into an independent Bundle
var sharedBundle = ExtractSharedResources(assets);

Shared resource identification:

Resources referenced by multiple Bundles should be extracted into a shared Bundle.

Shared Bundle advantages:

4.3 Dependency Graph Optimization

// Optimize dependency graph
public class DependencyOptimizer
{
    public void OptimizeDependencies(BuildMap buildMap)
    {
        // 1. Detect circular dependencies
        DetectCycles(buildMap);
        
        // 2. Extract shared resources
        ExtractSharedAssets(buildMap);
        
        // 3. Optimize Bundle size
        OptimizeBundleSize(buildMap);
    }
}

Circular dependency detection:

Use graph algorithms to detect circular dependencies.

Shared resource extraction:

Extract shared resources into independent Bundles.

Bundle size optimization:

Optimize Bundle size by splitting or merging.


V. Sub-packaging Strategies

5.1 Installer Sub-packaging

Divide resources into built-in resources and updatable resources:

Built-in resources:

Updatable resources:

Implementation:

// Built-in resource Collector
var buildinCollector = new AssetBundleCollector
{
    CollectPath = "Assets/Core",
    PackRuleType = ECollectorPackRuleType.Directory,
    BuildInBuildPipeline = true, // pack into installer
};

// Updatable resource Collector
var updatableCollector = new AssetBundleCollector
{
    CollectPath = "Assets/Content",
    PackRuleType = ECollectorPackRuleType.Directory,
    BuildInBuildPipeline = false, // do not pack into installer
};

5.2 Channel Sub-packaging

Different channels have different package contents:

Channel differences:

Implementation:

// Configure based on channel
public class ChannelConfig
{
    public string ChannelName;
    public List<string> Bundles;
}

5.3 Platform Sub-packaging

Different platforms have different resources:

Platform differences:

Implementation:

YooAsset automatically builds by target platform, no manual configuration needed.


VI. Best Practices

6.1 Startup Performance Optimization

Startup-required resources:

Pack startup-required resources into the installer.

Load on demand:

Load non-startup-required resources on demand.

Preloading:

Preload resources needed in the future during game idle time.

6.2 Memory Optimization

Bundle size control:

Avoid single Bundles being too large.

Resource reuse:

Reduce memory usage through shared Bundles.

Timely release:

Release unused resources promptly.

6.3 Package Size Optimization

Compression strategy:

Choose appropriate compression methods based on resource type.

Redundancy elimination:

Eliminate redundancy through shared Bundles.

On-demand inclusion:

Only include necessary resources.

6.4 Loading Performance Optimization

Preloading:

Preload commonly used resources at game startup.

Frame-distributed loading:

Spread resource loading across multiple frames.

Priority management:

Load critical resources first.


VII. Summary

This chapter deeply analyzes YooAsset resource packaging strategies, including:

With a reasonable packaging strategy, you can significantly improve game performance, reduce package size, and speed up loading.


Next: Core Technology - Compression and Encryption