<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: GameDevToolLab</title>
    <description>The latest articles on DEV Community by GameDevToolLab (@gamedevtoollab).</description>
    <link>https://dev.to/gamedevtoollab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3992439%2F58833102-eb15-4c51-a035-e55b9d236f1e.png</url>
      <title>DEV Community: GameDevToolLab</title>
      <link>https://dev.to/gamedevtoollab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gamedevtoollab"/>
    <language>en</language>
    <item>
      <title>A Practical Guide to Unity Addressables Bundle Splitting and LZ4/LZMA Compression</title>
      <dc:creator>GameDevToolLab</dc:creator>
      <pubDate>Fri, 19 Jun 2026 11:31:12 +0000</pubDate>
      <link>https://dev.to/gamedevtoollab/a-practical-guide-to-unity-addressables-bundle-splitting-and-lz4lzma-compression-49m6</link>
      <guid>https://dev.to/gamedevtoollab/a-practical-guide-to-unity-addressables-bundle-splitting-and-lz4lzma-compression-49m6</guid>
      <description>&lt;h2&gt;
  
  
  Overview
&lt;/h2&gt;

&lt;p&gt;In the previous article, we looked at Addressables download concurrency, label design, and batch downloads using labels.&lt;/p&gt;

&lt;p&gt;One important point there was this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Labels are only the entry point for specifying what you want to download. The actual files downloaded are AssetBundles.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In other words, even if your label design looks clean, a rough Bundle layout can still cause unexpected assets to be downloaded together.&lt;/p&gt;

&lt;p&gt;This time, we will look at how to split AssetBundles and how to choose compression settings.&lt;/p&gt;

&lt;p&gt;In particular, this article covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether Bundles should be split into smaller units or grouped together&lt;/li&gt;
&lt;li&gt;How to handle many small files, such as VN / adventure game scenario text files&lt;/li&gt;
&lt;li&gt;How to split assets that will keep increasing over time, such as character 3D models&lt;/li&gt;
&lt;li&gt;How to think about &lt;code&gt;Pack Together&lt;/code&gt;, &lt;code&gt;Pack Separately&lt;/code&gt;, and &lt;code&gt;Pack Together By Label&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;How to choose between LZ4 and LZMA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not an introduction to the official features. The focus is on practical decision-making for real projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Label design and Bundle splitting must be considered together
&lt;/h2&gt;

&lt;p&gt;In Addressables, you can use Addresses and Labels to specify which assets to load or download.&lt;/p&gt;

&lt;p&gt;However, the actual files downloaded are AssetBundles.&lt;/p&gt;

&lt;p&gt;For example, suppose you define labels like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chapter_01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assets used in Chapter 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chapter_02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assets used in Chapter 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;character_alice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assets related to Alice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;character_bob&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assets related to Bob&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you only look at the labels, it may seem like the assets are managed in a fine-grained way.&lt;/p&gt;

&lt;p&gt;But if the actual Bundle is packed as one large Bundle, downloading only &lt;code&gt;chapter_01&lt;/code&gt; may still download other assets included in the same Bundle.&lt;/p&gt;

&lt;p&gt;So, in Addressables, these two concepts need to be considered separately:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Address / Label&lt;/td&gt;
&lt;td&gt;Specifies which assets are requested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AssetBundle&lt;/td&gt;
&lt;td&gt;The actual unit downloaded, cached, and loaded&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Label design alone does not determine the download unit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Label design and Bundle splitting must be designed together.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What does Bundle splitting affect?
&lt;/h2&gt;

&lt;p&gt;Bundle splitting is not just a way to organize things in the Editor.&lt;/p&gt;

&lt;p&gt;In practice, it affects the following:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Affected area&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Download unit&lt;/td&gt;
&lt;td&gt;Which files are downloaded together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cache unit&lt;/td&gt;
&lt;td&gt;Which units are stored on the device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update unit&lt;/td&gt;
&lt;td&gt;Which Bundles become update targets during content updates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Load unit&lt;/td&gt;
&lt;td&gt;Which Bundles are required at load time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Number of files&lt;/td&gt;
&lt;td&gt;Affects download requests and file open operations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management cost&lt;/td&gt;
&lt;td&gt;Catalogs, dependencies, and operation rules become more complex&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Splitting Bundles into smaller units makes it easier to download only what is needed and reduce update size.&lt;/p&gt;

&lt;p&gt;On the other hand, if the number of Bundles increases too much, download requests, cached files, file open operations, catalog complexity, and dependency management cost all increase.&lt;/p&gt;

&lt;p&gt;So with Addressables, “smaller is always better” is not the right answer.&lt;/p&gt;

&lt;p&gt;The basic approach is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Group what should be grouped, and split what should be split, based on how the assets are actually used.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bundle Mode options
&lt;/h2&gt;

&lt;p&gt;In Addressables Group settings, you can choose a Bundle Mode.&lt;/p&gt;

&lt;p&gt;The main options are:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bundle Mode&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Suitable cases&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Pack Together&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Packs assets in the group into Bundles together&lt;/td&gt;
&lt;td&gt;Small files, or data used together&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Pack Separately&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Packs each Addressable entry in the group into a separate Bundle&lt;/td&gt;
&lt;td&gt;Characters, stages, costumes, and other assets with clear update units&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Pack Together By Label&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Packs assets with the same label set together&lt;/td&gt;
&lt;td&gt;Cases where you want to manage or download by label&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One important detail is that &lt;code&gt;Pack Separately&lt;/code&gt; does not mean “one asset per Bundle.”&lt;/p&gt;

&lt;p&gt;It means &lt;strong&gt;one Bundle per Addressable entry&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If a folder is marked as an Addressable entry, the contents under that folder may be packed into one Bundle.&lt;/p&gt;

&lt;p&gt;Also, scene assets are handled as separate Bundles from normal assets. Even with &lt;code&gt;Pack Together&lt;/code&gt;, everything is not necessarily packed into a single file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid casually saying “one address, one file”
&lt;/h2&gt;

&lt;p&gt;In real projects, people sometimes describe &lt;code&gt;Pack Separately&lt;/code&gt; as “one address, one file.”&lt;/p&gt;

&lt;p&gt;That may be fine for a rough conversation, but it is better to be careful when writing design documents or articles.&lt;/p&gt;

&lt;p&gt;As an Addressables setting, the accurate term is &lt;code&gt;Pack Separately&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Pack Separately&lt;/code&gt; creates a separate Bundle for each Addressable entry in the group.&lt;/p&gt;

&lt;p&gt;So the following cases are not as simple as “one asset = one Bundle”:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A folder is registered as an Addressable entry&lt;/li&gt;
&lt;li&gt;Sprite Atlases or Sub Assets are involved&lt;/li&gt;
&lt;li&gt;Scenes and normal assets are mixed&lt;/li&gt;
&lt;li&gt;Dependencies are moved into separate Bundles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a rough explanation, “one address, one file” may be understandable.&lt;/p&gt;

&lt;p&gt;But for actual design, it is safer to think in terms of &lt;code&gt;Pack Separately&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cases where grouping Bundles is acceptable
&lt;/h2&gt;

&lt;p&gt;First, let’s look at cases where grouping assets into Bundles is reasonable.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Asset characteristic&lt;/th&gt;
&lt;th&gt;How to think about it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Each file is small&lt;/td&gt;
&lt;td&gt;Creating individual Bundles may make the file count a bigger problem&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;There are many files&lt;/td&gt;
&lt;td&gt;Download requests and file open operations can increase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;They are used together&lt;/td&gt;
&lt;td&gt;Splitting does not change the actual load unit much&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Individual updates are rare&lt;/td&gt;
&lt;td&gt;Fine-grained update units provide little benefit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The management unit is clear&lt;/td&gt;
&lt;td&gt;Easy to group by chapter, event, language, and so on&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Typical examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VN / adventure game scenario text&lt;/li&gt;
&lt;li&gt;Dialogue text&lt;/li&gt;
&lt;li&gt;Small &lt;code&gt;.txt&lt;/code&gt; files&lt;/li&gt;
&lt;li&gt;Small configuration files&lt;/li&gt;
&lt;li&gt;Master data&lt;/li&gt;
&lt;li&gt;Localization text&lt;/li&gt;
&lt;li&gt;Lightweight ScriptableObject assets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this kind of data, creating one Bundle per file may not be the easiest approach to operate.&lt;/p&gt;

&lt;p&gt;Especially when each file is only a few KB to a few dozen KB, and there are hundreds or thousands of them, the downside of increasing the number of files can become more noticeable than the benefit of fine-grained Bundles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Many small files, such as VN scenario text
&lt;/h2&gt;

&lt;p&gt;VN / adventure game scenario text is an easy example where grouping often makes sense.&lt;/p&gt;

&lt;p&gt;For example, suppose you have a structure like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Scenario/
  Chapter01/
    scene_001.txt
    scene_002.txt
    scene_003.txt
    ...
  Chapter02/
    scene_001.txt
    scene_002.txt
    scene_003.txt
    ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If every &lt;code&gt;.txt&lt;/code&gt; file is packed into its own Bundle, the number of files increases quickly.&lt;/p&gt;

&lt;p&gt;When the file count increases, the following costs also increase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More download requests&lt;/li&gt;
&lt;li&gt;More cached files&lt;/li&gt;
&lt;li&gt;More file open operations&lt;/li&gt;
&lt;li&gt;More file lookup and management cost&lt;/li&gt;
&lt;li&gt;Catalog and dependency checks become more tedious&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Of course, if you need to update each scenario file independently, or if you absolutely do not want to download a scenario until the user is about to read it, splitting into smaller units may be valid.&lt;/p&gt;

&lt;p&gt;But in many cases, grouping like this is easier to operate:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grouping unit&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chapter&lt;/td&gt;
&lt;td&gt;&lt;code&gt;scenario_chapter_01&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event&lt;/td&gt;
&lt;td&gt;&lt;code&gt;scenario_event_summer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;scenario_ja&lt;/code&gt;, &lt;code&gt;scenario_en&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Delivery unit&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;scenario_initial&lt;/code&gt;, &lt;code&gt;scenario_update_001&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For scenario text, users often play by chapter or event.&lt;/p&gt;

&lt;p&gt;So grouping Bundles by those units usually makes operation easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cases where Bundles should be split
&lt;/h2&gt;

&lt;p&gt;On the other hand, there are also cases where splitting Bundles is better.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Asset characteristic&lt;/th&gt;
&lt;th&gt;How to think about it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Each asset is large&lt;/td&gt;
&lt;td&gt;Downloading unnecessary data becomes costly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The addition unit is clear&lt;/td&gt;
&lt;td&gt;Easy to update by character, costume, or stage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Individual updates are frequent&lt;/td&gt;
&lt;td&gt;Update diffs can be kept smaller&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The asset may not be used&lt;/td&gt;
&lt;td&gt;It can be downloaded only when needed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;There is a sales or unlock unit&lt;/td&gt;
&lt;td&gt;Works well with DLC, gacha, event rewards, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Typical examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Character 3D models&lt;/li&gt;
&lt;li&gt;Character-specific Meshes&lt;/li&gt;
&lt;li&gt;Character-specific Textures&lt;/li&gt;
&lt;li&gt;Character-specific Materials&lt;/li&gt;
&lt;li&gt;Character-specific Animations&lt;/li&gt;
&lt;li&gt;Costumes&lt;/li&gt;
&lt;li&gt;Weapons&lt;/li&gt;
&lt;li&gt;Stages&lt;/li&gt;
&lt;li&gt;Large Prefabs&lt;/li&gt;
&lt;li&gt;VFX&lt;/li&gt;
&lt;li&gt;Voice assets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you group these too aggressively, operation can become painful.&lt;/p&gt;

&lt;p&gt;In particular, assets such as characters and stages often increase over time. Splitting Bundles by the unit in which they are added makes them easier to manage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assets that keep increasing, such as character 3D models
&lt;/h2&gt;

&lt;p&gt;Character 3D models are an easy example where splitting Bundles often makes sense.&lt;/p&gt;

&lt;p&gt;Suppose all characters are packed into one Bundle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;character_all.bundle
  Alice
  Bob
  Carol
  Dave
  Eve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this layout, adding just one new character can make the entire &lt;code&gt;character_all.bundle&lt;/code&gt; an update target.&lt;/p&gt;

&lt;p&gt;Even if a user only needs Alice, they may still download Bob and the other characters because they are in the same Bundle.&lt;/p&gt;

&lt;p&gt;On the other hand, if you split Bundles by character, the update and download units become clearer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;character_alice.bundle
character_bob.bundle
character_carol.bundle
character_dave.bundle
character_eve.bundle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this layout, if only Alice is needed, only Alice’s Bundle can be downloaded.&lt;/p&gt;

&lt;p&gt;When adding a new character, you can add a new Bundle and avoid updating existing character Bundles as much as possible.&lt;/p&gt;

&lt;p&gt;A character Bundle may contain assets like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;character_alice.bundle
  Alice.prefab
  Alice.mesh
  Alice.material
  Alice_texture_base
  Alice_texture_normal
  Alice_animation_idle
  Alice_animation_run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This kind of layout is practical because &lt;strong&gt;larger assets that are used together are grouped by their addition and update unit&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;Pack Together By Label&lt;/code&gt; is useful, but depends on label design
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Pack Together By Label&lt;/code&gt; packs assets with the same label set into Bundles.&lt;/p&gt;

&lt;p&gt;If your label design is clean, this can make it easier to create Bundles by label.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Asset&lt;/th&gt;
&lt;th&gt;Labels&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Alice-related assets&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;character_alice&lt;/code&gt;, &lt;code&gt;initial_download&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bob-related assets&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;character_bob&lt;/code&gt;, &lt;code&gt;event_001&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 1 scenario&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;scenario_chapter_01&lt;/code&gt;, &lt;code&gt;initial_download&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter 2 scenario&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;scenario_chapter_02&lt;/code&gt;, &lt;code&gt;update_001&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;However, if labels are messy, relying on &lt;code&gt;Pack Together By Label&lt;/code&gt; can easily produce an unintended Bundle layout.&lt;/p&gt;

&lt;p&gt;For example, if management labels, download labels, event labels, and search labels are mixed together, the number of label combinations increases and the Bundle layout becomes hard to read.&lt;/p&gt;

&lt;p&gt;When using &lt;code&gt;Pack Together By Label&lt;/code&gt;, it is safer to separate label responsibilities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label type&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Download labels&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;initial_download&lt;/code&gt;, &lt;code&gt;chapter_01&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;These may affect Bundle splitting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Classification labels&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;character&lt;/code&gt;, &lt;code&gt;scenario&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Decide whether they should affect Bundle splitting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Management labels&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;deprecated&lt;/code&gt;, &lt;code&gt;debug&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Avoid mixing them with runtime labels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Event labels&lt;/td&gt;
&lt;td&gt;&lt;code&gt;event_001&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Also consider what happens after the event ends&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Increasing the number of labels is not bad by itself.&lt;/p&gt;

&lt;p&gt;But when using &lt;code&gt;Pack Together By Label&lt;/code&gt;, the label set directly affects the Bundle layout, so you need operation rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to decide whether to group or split
&lt;/h2&gt;

&lt;p&gt;As a rough guide:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Asset characteristic&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Many small files&lt;/td&gt;
&lt;td&gt;Group them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Used together by chapter or event&lt;/td&gt;
&lt;td&gt;Group them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Little need for individual updates&lt;/td&gt;
&lt;td&gt;Group them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Too many files are being created&lt;/td&gt;
&lt;td&gt;Group them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Each asset is large&lt;/td&gt;
&lt;td&gt;Split them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Addition unit is clear&lt;/td&gt;
&lt;td&gt;Split them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Added by character, costume, or stage&lt;/td&gt;
&lt;td&gt;Split them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You do not want to download unused assets&lt;/td&gt;
&lt;td&gt;Split them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You want to keep update diffs small&lt;/td&gt;
&lt;td&gt;Split them&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In more practical terms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Group many small files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Split large assets with clear addition units&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Group assets that are used together&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Split assets that may not be used&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Split assets with different update units&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are the basic rules for Bundle splitting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Difference between LZ4 and LZMA
&lt;/h2&gt;

&lt;p&gt;Next, let’s look at compression settings.&lt;/p&gt;

&lt;p&gt;In Addressables Group settings, you can choose the compression format for Bundles.&lt;/p&gt;

&lt;p&gt;The common choices are LZ4 and LZMA.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Compression&lt;/th&gt;
&lt;th&gt;Characteristics&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;LZMA&lt;/td&gt;
&lt;td&gt;High compression ratio, useful for reducing download size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LZ4&lt;/td&gt;
&lt;td&gt;Chunk-based and easier to handle at load time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Uncompressed&lt;/td&gt;
&lt;td&gt;No decompression cost, but file size tends to be larger&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;LZMA treats the entire Bundle as one compressed stream.&lt;/p&gt;

&lt;p&gt;This usually gives a higher compression ratio, but the decompression cost during loading can become larger.&lt;/p&gt;

&lt;p&gt;LZ4 compresses data in chunks.&lt;/p&gt;

&lt;p&gt;Its compression ratio is usually lower than LZMA, but it is easier to read only the needed parts, and it tends to be lighter to handle at load time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cases where LZMA is easy to recommend
&lt;/h2&gt;

&lt;p&gt;LZMA is useful when you want to reduce download size.&lt;/p&gt;

&lt;p&gt;However, in real projects, it is safer to decide based on &lt;strong&gt;what is inside the Bundle&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As a rule of thumb:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If 1 Bundle is close to 1 asset, LZMA is easy to recommend.
If 1 Bundle contains multiple assets, LZ4 should be the default.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, “1 Bundle = 1 asset” means cases like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One large binary file&lt;/li&gt;
&lt;li&gt;One large TextAsset&lt;/li&gt;
&lt;li&gt;One video file&lt;/li&gt;
&lt;li&gt;One audio file&lt;/li&gt;
&lt;li&gt;One Prefab packed into its own Bundle&lt;/li&gt;
&lt;li&gt;One Texture packed into its own Bundle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These Bundles are likely to be loaded almost entirely when used.&lt;/p&gt;

&lt;p&gt;That makes it easier to benefit from LZMA’s high compression ratio.&lt;/p&gt;

&lt;p&gt;On the other hand, be careful with a Bundle like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;character_alice.bundle
  Alice.prefab
  Alice.mesh
  Alice.material
  Alice_texture_base
  Alice_texture_normal
  Alice_animation_idle
  Alice_animation_run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a “one character, one Bundle” layout, but the Bundle still contains multiple assets.&lt;/p&gt;

&lt;p&gt;Even if it looks like one unit called Alice at the application level, the Bundle itself is a collection of multiple assets.&lt;/p&gt;

&lt;p&gt;So it is safer not to casually decide “one character Bundle means LZMA.”&lt;/p&gt;

&lt;p&gt;LZMA is easy to recommend only when the layout is close to &lt;strong&gt;1 Bundle = 1 asset&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use LZ4 as the default for Bundles containing multiple assets
&lt;/h2&gt;

&lt;p&gt;LZMA treats the entire Bundle as one compressed stream.&lt;/p&gt;

&lt;p&gt;So even if you only want to read part of the Bundle, the decompression cost of the whole Bundle can become an issue at load time.&lt;/p&gt;

&lt;p&gt;When multiple independent assets are grouped into one Bundle, LZ4 is usually easier to operate.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bundle layout where LZ4 should be the default&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bundle containing multiple Addressable entries&lt;/td&gt;
&lt;td&gt;You may only read part of it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bundle containing many small files&lt;/td&gt;
&lt;td&gt;The purpose is reducing file count, so partial access matters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter-level scenario Bundle&lt;/td&gt;
&lt;td&gt;You may not read every file in the chapter at once&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Master data Bundle&lt;/td&gt;
&lt;td&gt;Only some data may be referenced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Localization Bundle&lt;/td&gt;
&lt;td&gt;Data may be read by language or screen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Character-related asset Bundle&lt;/td&gt;
&lt;td&gt;Often contains Prefab, Mesh, Texture, Animation, etc.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bundle where stable load time and memory behavior matter&lt;/td&gt;
&lt;td&gt;Avoiding full-stream decompression is safer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important point is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“One character, one Bundle” and “one Bundle, one asset” are different things.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Even if a character has its own Bundle, if that Bundle contains a Prefab, Meshes, Textures, Materials, and Animations, it is still a multi-asset Bundle.&lt;/p&gt;

&lt;p&gt;In that case, using LZ4 as the default usually makes load-time behavior more stable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cases where LZ4 should be the default
&lt;/h2&gt;

&lt;p&gt;LZ4 is suitable when you care about load-time handling.&lt;/p&gt;

&lt;p&gt;In Addressables, it is common to group multiple assets into one Bundle. In practice, &lt;strong&gt;LZ4 is usually the default choice for multi-asset Bundles&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bundle layout&lt;/th&gt;
&lt;th&gt;Reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Bundle containing many small files&lt;/td&gt;
&lt;td&gt;You may only read part of it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chapter-level scenario Bundle&lt;/td&gt;
&lt;td&gt;Files are often read in sequence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Master data Bundle&lt;/td&gt;
&lt;td&gt;Only some data may be referenced&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Localization Bundle&lt;/td&gt;
&lt;td&gt;Data may be read by language or screen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bundle containing multiple Addressable entries&lt;/td&gt;
&lt;td&gt;LZMA is more affected by whole-Bundle decompression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Character-related asset Bundle&lt;/td&gt;
&lt;td&gt;Often contains multiple assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bundle where stable load time matters&lt;/td&gt;
&lt;td&gt;Chunk-based compression is easier to operate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For Bundles that group multiple files, such as VN scenario text, LZ4 is often easier to handle.&lt;/p&gt;

&lt;p&gt;Group the Bundle to reduce the number of files.&lt;/p&gt;

&lt;p&gt;But use LZ4 because you may only read part of the Bundle.&lt;/p&gt;

&lt;p&gt;This combination is very practical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical recommended settings
&lt;/h2&gt;

&lt;p&gt;As a starting point, the following rules are easy to work with:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Asset type&lt;/th&gt;
&lt;th&gt;Bundle split&lt;/th&gt;
&lt;th&gt;Compression&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One large TextAsset&lt;/td&gt;
&lt;td&gt;1 asset per Bundle&lt;/td&gt;
&lt;td&gt;LZMA recommended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One large binary file&lt;/td&gt;
&lt;td&gt;1 asset per Bundle&lt;/td&gt;
&lt;td&gt;LZMA recommended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One video file&lt;/td&gt;
&lt;td&gt;1 asset per Bundle&lt;/td&gt;
&lt;td&gt;LZMA recommended, but also consider compression of the video format itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One audio file&lt;/td&gt;
&lt;td&gt;1 asset per Bundle&lt;/td&gt;
&lt;td&gt;LZMA recommended, but also consider compression of the audio format itself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One Texture&lt;/td&gt;
&lt;td&gt;1 asset per Bundle&lt;/td&gt;
&lt;td&gt;LZMA recommended, but judge based on the size after texture compression&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VN scenario text&lt;/td&gt;
&lt;td&gt;Group by chapter or event&lt;/td&gt;
&lt;td&gt;LZ4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dialogue text&lt;/td&gt;
&lt;td&gt;Group by chapter, event, or language&lt;/td&gt;
&lt;td&gt;LZ4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Master data&lt;/td&gt;
&lt;td&gt;Group by type or update unit&lt;/td&gt;
&lt;td&gt;LZ4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Localization&lt;/td&gt;
&lt;td&gt;Group by language&lt;/td&gt;
&lt;td&gt;LZ4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Character 3D models&lt;/td&gt;
&lt;td&gt;Consider one Bundle per character&lt;/td&gt;
&lt;td&gt;LZ4 if the Bundle contains multiple assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Costumes&lt;/td&gt;
&lt;td&gt;Consider one Bundle per costume&lt;/td&gt;
&lt;td&gt;LZ4 if the Bundle contains multiple assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stages&lt;/td&gt;
&lt;td&gt;Consider one Bundle per stage&lt;/td&gt;
&lt;td&gt;LZ4 if the Bundle contains multiple assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Large VFX&lt;/td&gt;
&lt;td&gt;Split by usage unit&lt;/td&gt;
&lt;td&gt;LZ4 if the Bundle contains multiple assets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Voice assets&lt;/td&gt;
&lt;td&gt;Split by character, chapter, or event&lt;/td&gt;
&lt;td&gt;LZ4 if multiple files are grouped together&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key point is to think about Bundle granularity and compression format separately.&lt;/p&gt;

&lt;p&gt;Splitting Bundles, such as one Bundle per character, is useful for reducing download and update units.&lt;/p&gt;

&lt;p&gt;However, if that Bundle contains multiple assets, LZ4 should be the default compression choice.&lt;/p&gt;

&lt;p&gt;Conversely, if a Bundle contains only one asset, LZMA is easy to recommend.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 Bundle is close to 1 asset&lt;/td&gt;
&lt;td&gt;LZMA recommended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The whole Bundle is always read&lt;/td&gt;
&lt;td&gt;LZMA is easier to recommend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You strongly want to reduce initial download size&lt;/td&gt;
&lt;td&gt;LZMA is easier to recommend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multiple Addressable entries are included&lt;/td&gt;
&lt;td&gt;LZ4 by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You may only read part of the Bundle&lt;/td&gt;
&lt;td&gt;LZ4 by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Many small files are grouped together&lt;/td&gt;
&lt;td&gt;LZ4 by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;You want stable load time&lt;/td&gt;
&lt;td&gt;LZ4 by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web delivery is involved&lt;/td&gt;
&lt;td&gt;Start with LZ4 in mind&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Of course, the final decision should be based on real device measurements.&lt;/p&gt;

&lt;p&gt;Even with “1 asset per Bundle,” the perceived behavior changes depending on asset type, size, device performance, and load timing.&lt;/p&gt;

&lt;p&gt;Measure download size, load time, and memory usage on real devices before making the final decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Notes on Bundle splitting
&lt;/h2&gt;

&lt;p&gt;There are a few additional things to keep in mind when splitting Bundles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Duplicate dependencies
&lt;/h3&gt;

&lt;p&gt;When Bundles are split into smaller units, shared dependencies become important.&lt;/p&gt;

&lt;p&gt;For example, if multiple characters reference the same Material or Texture, the dependency layout can become complicated depending on how you split the Bundles.&lt;/p&gt;

&lt;p&gt;You need operation rules for whether shared assets should be moved into a shared Bundle or kept with each character.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do not look only at update diffs
&lt;/h3&gt;

&lt;p&gt;Splitting Bundles into smaller units makes update diffs easier to reduce.&lt;/p&gt;

&lt;p&gt;But the trade-off is an increased number of Bundles.&lt;/p&gt;

&lt;p&gt;If you only look at update size, you may want to split everything. But download requests, cache count, and load-time management cost should be considered together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Think about initial downloads and additional downloads separately
&lt;/h3&gt;

&lt;p&gt;Assets needed for the initial download and assets downloaded later should not be judged by the same rule.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;How to think about it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Initial download&lt;/td&gt;
&lt;td&gt;Group assets needed immediately after launch and reduce the number of downloads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Additional download&lt;/td&gt;
&lt;td&gt;Download only what is needed by character, stage, or event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optional download&lt;/td&gt;
&lt;td&gt;Download voices, high-resolution textures, etc. only when needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For initial downloads, grouping more aggressively can be easier.&lt;/p&gt;

&lt;p&gt;For additional downloads, making the unit clear is usually easier to operate.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do not mix the responsibilities of labels and Bundle Mode too much
&lt;/h3&gt;

&lt;p&gt;Labels are useful, but trying to solve everything with labels can break the design.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Labels for specifying download targets&lt;/li&gt;
&lt;li&gt;Labels for search or classification&lt;/li&gt;
&lt;li&gt;Labels for management&lt;/li&gt;
&lt;li&gt;Labels for events&lt;/li&gt;
&lt;li&gt;Labels for debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If all of these are mixed together and you use &lt;code&gt;Pack Together By Label&lt;/code&gt;, the Bundle layout becomes difficult to understand.&lt;/p&gt;

&lt;p&gt;When adding labels, consider whether each label is allowed to affect Bundle splitting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical checklist
&lt;/h2&gt;

&lt;p&gt;Finally, here is a checklist for deciding Bundle layout.&lt;/p&gt;

&lt;h3&gt;
  
  
  Group or split
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Are these assets used together?&lt;/li&gt;
&lt;li&gt;[ ] Do you want to download them individually?&lt;/li&gt;
&lt;li&gt;[ ] Do you want to update them individually?&lt;/li&gt;
&lt;li&gt;[ ] Is each file large?&lt;/li&gt;
&lt;li&gt;[ ] Is the number of files getting too high?&lt;/li&gt;
&lt;li&gt;[ ] Is there a clear unit such as character, chapter, stage, or event?&lt;/li&gt;
&lt;li&gt;[ ] Is this part of the initial download or an additional download?&lt;/li&gt;
&lt;li&gt;[ ] Are unnecessary assets being downloaded?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compression settings
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Is download size the priority?&lt;/li&gt;
&lt;li&gt;[ ] Is load time the priority?&lt;/li&gt;
&lt;li&gt;[ ] Is the layout close to 1 Bundle = 1 asset?&lt;/li&gt;
&lt;li&gt;[ ] Does the Bundle contain multiple assets?&lt;/li&gt;
&lt;li&gt;[ ] Is there a chance that only part of the Bundle will be read?&lt;/li&gt;
&lt;li&gt;[ ] Did you measure download size on a real device?&lt;/li&gt;
&lt;li&gt;[ ] Did you measure load time on a real device?&lt;/li&gt;
&lt;li&gt;[ ] Did you measure memory usage on a real device?&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Operation
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Does the label design match the Bundle layout?&lt;/li&gt;
&lt;li&gt;[ ] Are you relying too much on &lt;code&gt;Pack Together By Label&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;[ ] Have you decided how to handle shared dependencies?&lt;/li&gt;
&lt;li&gt;[ ] Are you balancing update size and file count?&lt;/li&gt;
&lt;li&gt;[ ] Will the design still work after more assets are added post-release?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;With Addressables Bundle splitting, neither “split everything” nor “group everything” is always correct.&lt;/p&gt;

&lt;p&gt;The important thing is to decide based on how the assets are used, update units, download units, file count, and load-time cost.&lt;/p&gt;

&lt;p&gt;For data such as VN scenario text, where each file is small but there are many files, grouping by chapter or event can be easier to operate.&lt;/p&gt;

&lt;p&gt;This is because increasing the number of files also increases download requests, cached files, file open operations, file lookup cost, and management cost.&lt;/p&gt;

&lt;p&gt;On the other hand, for assets such as character 3D models, where each asset is large and new assets are likely to be added over time, splitting by character can be easier to manage.&lt;/p&gt;

&lt;p&gt;For compression, the rule of thumb is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If 1 Bundle is close to 1 asset, LZMA is recommended. If the Bundle contains multiple assets, use LZ4 by default.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;LZMA is useful when compression ratio is the priority, but because whole-Bundle decompression can become an issue, it is safer to avoid it when multiple independent load targets are grouped into one Bundle.&lt;/p&gt;

&lt;p&gt;On the other hand, if the Bundle effectively contains one asset, such as one large TextAsset, one binary file, or one Texture, LZMA is easy to recommend.&lt;/p&gt;

&lt;p&gt;In the end, always measure download size, load time, and memory usage on real devices before making the final decision.&lt;/p&gt;

&lt;p&gt;Addressables can look complicated if you only look at the settings.&lt;/p&gt;

&lt;p&gt;But in practice, the basic idea is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Group small files. Split large assets with clear addition units. For compression, use LZMA when 1 Bundle is close to 1 asset, and use LZ4 by default for multi-asset Bundles.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Starting from this policy makes it easier to build a Bundle layout that does not break down over time.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>addressables</category>
      <category>assetbundle</category>
    </item>
    <item>
      <title>Practical Tips for Unity Addressables: Concurrent Downloads and Label Design</title>
      <dc:creator>GameDevToolLab</dc:creator>
      <pubDate>Fri, 19 Jun 2026 11:29:54 +0000</pubDate>
      <link>https://dev.to/gamedevtoollab/practical-tips-for-unity-addressables-concurrent-downloads-and-label-design-1dho</link>
      <guid>https://dev.to/gamedevtoollab/practical-tips-for-unity-addressables-concurrent-downloads-and-label-design-1dho</guid>
      <description>&lt;h1&gt;
  
  
  Overview
&lt;/h1&gt;

&lt;p&gt;Unity Addressables makes it much easier to handle remote asset downloads and cache management.&lt;/p&gt;

&lt;p&gt;However, when you use it in a real project, you may run into issues like these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calling &lt;code&gt;DownloadDependenciesAsync&lt;/code&gt; does not make downloads as fast as expected&lt;/li&gt;
&lt;li&gt;Downloading by label pulls in assets you did not expect&lt;/li&gt;
&lt;li&gt;Manually managing Address and Label settings becomes painful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article focuses on the points that are easy to overlook when designing downloads with Addressables:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configuring the number of concurrent downloads&lt;/li&gt;
&lt;li&gt;How to think about concurrent downloads on iOS and Android&lt;/li&gt;
&lt;li&gt;Why you should start downloading larger files first&lt;/li&gt;
&lt;li&gt;Bulk downloads using labels&lt;/li&gt;
&lt;li&gt;The difference between labels and AssetBundle download units&lt;/li&gt;
&lt;li&gt;Automating management with Smart Addresser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bundle splitting and LZ4/LZMA compression will be covered in a separate article, so this article only touches on them where necessary.&lt;/p&gt;




&lt;h2&gt;
  
  
  Addressables download speed is not determined by a single API call
&lt;/h2&gt;

&lt;p&gt;When pre-downloading assets with Addressables, the API you will often use is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DownloadDependenciesAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful because it allows you to download the dependencies associated with a label or address ahead of time.&lt;/p&gt;

&lt;p&gt;That makes the user experience more stable than suddenly downloading assets right before a loading sequence.&lt;/p&gt;

&lt;p&gt;However, download speed is not determined just by calling this API.&lt;/p&gt;

&lt;p&gt;In practice, it depends on factors such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The number of concurrent downloads&lt;/li&gt;
&lt;li&gt;CDN or server response speed&lt;/li&gt;
&lt;li&gt;The user's network condition&lt;/li&gt;
&lt;li&gt;AssetBundle size&lt;/li&gt;
&lt;li&gt;The number of AssetBundles&lt;/li&gt;
&lt;li&gt;Device performance&lt;/li&gt;
&lt;li&gt;Decompression and loading cost after download&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Especially in mobile games, &lt;strong&gt;the number of concurrent downloads&lt;/strong&gt; and &lt;strong&gt;the order in which downloads are started&lt;/strong&gt; are very important.&lt;/p&gt;




&lt;h2&gt;
  
  
  Configure the number of concurrent downloads properly
&lt;/h2&gt;

&lt;p&gt;Addressables allows you to control how many web requests run at the same time.&lt;/p&gt;

&lt;p&gt;At runtime, you can configure it with the following API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;WebRequestQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetMaxConcurrentRequests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxRequests&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the number of concurrent downloads is too low, you may not fully utilize the available network or CDN performance.&lt;/p&gt;

&lt;p&gt;On the other hand, if it is too high, you may run into problems such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased load on low-end devices&lt;/li&gt;
&lt;li&gt;Lower frame rate during downloads&lt;/li&gt;
&lt;li&gt;More heat generation&lt;/li&gt;
&lt;li&gt;Bottlenecks during decompression or loading after downloads&lt;/li&gt;
&lt;li&gt;Instability depending on the network condition&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, more concurrent downloads do not always mean faster downloads.&lt;/p&gt;

&lt;p&gt;You need to tune this based on your target devices, Bundle size, network environment, and loading screen design.&lt;/p&gt;




&lt;h2&gt;
  
  
  Use 10 on iOS, and switch between 3 and 10 on Android based on device performance
&lt;/h2&gt;

&lt;p&gt;In my projects, I use the following policy based on real-device testing.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Concurrent downloads&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;iOS&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High-end Android devices&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Low- to mid-range Android devices&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important point is that this is not an official fixed recommendation from Unity.&lt;/p&gt;

&lt;p&gt;It is a practical policy adopted after testing within a specific project.&lt;/p&gt;

&lt;p&gt;:::message&lt;br&gt;
In this article, I use 10 concurrent downloads on iOS and either 3 or 10 on Android depending on device performance, as a practical policy based on real-device testing.&lt;/p&gt;

&lt;p&gt;The optimal value depends on your CDN, network condition, Bundle size, and device performance, so make sure to measure it on actual devices.&lt;br&gt;
:::&lt;/p&gt;

&lt;p&gt;iOS devices tend to have less variation in performance, so it is easier to use a relatively aggressive setting.&lt;/p&gt;

&lt;p&gt;Android devices vary much more, so it is safer to switch the value based on device performance instead of using 10 for every device.&lt;/p&gt;


&lt;h2&gt;
  
  
  Configure concurrent downloads at runtime
&lt;/h2&gt;

&lt;p&gt;If you want to change the number of concurrent downloads per device, call &lt;code&gt;WebRequestQueue.SetMaxConcurrentRequests()&lt;/code&gt; when the app starts.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine.ResourceManagement&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AddressablesDownloadTuning&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Apply&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;maxRequests&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;GetMaxConcurrentRequests&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;WebRequestQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetMaxConcurrentRequests&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;maxRequests&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Addressables max concurrent requests: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;maxRequests&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;GetMaxConcurrentRequests&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="cp"&gt;#if UNITY_IOS
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#elif UNITY_ANDROID
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;GetAndroidDeviceScore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#else
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="cp"&gt;#if UNITY_ANDROID
&lt;/span&gt;    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;GetAndroidDeviceScore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SystemInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;systemMemorySize&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;6000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SystemInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;systemMemorySize&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SystemInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;processorCount&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SystemInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;graphicsMemorySize&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="m"&gt;2048&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Call it during app initialization.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppInitializer&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Awake&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;AddressablesDownloadTuning&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Apply&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key is to configure this before Addressables downloads begin.&lt;/p&gt;

&lt;p&gt;It is easier to manage if you call it at a fixed timing, such as during initial app setup or around Addressables initialization.&lt;/p&gt;




&lt;h2&gt;
  
  
  Adjust Android scoring for your project
&lt;/h2&gt;

&lt;p&gt;In the sample above, the Android device score is calculated using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System memory&lt;/li&gt;
&lt;li&gt;CPU core count&lt;/li&gt;
&lt;li&gt;GPU memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, this scoring method is only an example.&lt;/p&gt;

&lt;p&gt;In practice, the best criteria will differ depending on your project's target devices, Bundle sizes, download-time load, and loading screen design.&lt;/p&gt;

&lt;p&gt;For example, you may want to tune it while checking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimum target device specs&lt;/li&gt;
&lt;li&gt;FPS during downloads&lt;/li&gt;
&lt;li&gt;Memory usage during downloads&lt;/li&gt;
&lt;li&gt;Decompression and loading time after downloads&lt;/li&gt;
&lt;li&gt;Heat generation&lt;/li&gt;
&lt;li&gt;Network conditions&lt;/li&gt;
&lt;li&gt;Whether other loading tasks also run during downloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Android devices vary widely, so you cannot simply say, "This device has a lot of memory, so 10 is fine."&lt;/p&gt;

&lt;p&gt;Even if the memory and CPU specs look good, storage performance or network conditions can still make download behavior unstable.&lt;/p&gt;

&lt;p&gt;For that reason, device scoring should not be treated as a fixed answer.&lt;/p&gt;

&lt;p&gt;It should be adjusted per project based on real-device testing.&lt;/p&gt;

&lt;p&gt;Personally, I first decide a safe value for low-end devices, then increase the number of concurrent downloads only for higher-end devices.&lt;/p&gt;




&lt;h2&gt;
  
  
  Start downloading larger files first when downloading multiple files
&lt;/h2&gt;

&lt;p&gt;When configuring concurrent downloads, there is one more thing to consider: the order in which downloads are started.&lt;/p&gt;

&lt;p&gt;If you manage your own queue of multiple Bundles or labels, it is generally better to &lt;strong&gt;start with the largest files first&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The reason is that you want to avoid leaving one huge file until the very end.&lt;/p&gt;

&lt;p&gt;For example, suppose the maximum number of concurrent downloads is 3 and you have the following download targets.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Size&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;300MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;20MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;10MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;8MB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;5MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you start from the smallest files, the download may look smooth at first.&lt;/p&gt;

&lt;p&gt;However, if the 300MB file is left until the end, the progress can appear to stall near the end of the loading screen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Starting from smaller files

[ 5MB ] [ 8MB ] [ 10MB ]
[ 20MB ]
[ 300MB ] &amp;lt;- Only the largest file remains at the end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the other hand, if you start downloading the larger file first, the 300MB file can progress in the background while smaller files are processed in the remaining request slots.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Starting from larger files

[ 300MB ] [ 20MB ] [ 10MB ]
[ 8MB ] [ 5MB ] &amp;lt;- Smaller files are processed while the larger one is already running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Even with the same number of concurrent downloads, the perceived waiting time can change depending on the order.&lt;/p&gt;

&lt;p&gt;This is especially useful when you download multiple additional assets together on a loading screen.&lt;/p&gt;

&lt;p&gt;In that case, it is usually better to enqueue larger Bundles first.&lt;/p&gt;

&lt;p&gt;However, when you call &lt;code&gt;Addressables.DownloadDependenciesAsync(label)&lt;/code&gt; for a single label, it is difficult to precisely control which Bundle is downloaded first internally.&lt;/p&gt;

&lt;p&gt;If you want explicit control over the download order, split your download targets by label or key, get their sizes in advance, and then start downloads in descending order of size.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Linq&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine.AddressableAssets&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine.ResourceManagement.AsyncOperations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AddressablesPreloadQueue&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SerializeField&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;preloadLabels&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s"&gt;"scenario_chapter_01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"voice_jp_chapter_01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s"&gt;"character_hero_001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;PreloadBySize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;preloadLabels&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="nf"&gt;PreloadBySize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IReadOnlyList&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;DownloadTarget&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;labels&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sizeHandle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetDownloadSizeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sizeHandle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizeHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;AsyncOperationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Succeeded&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt;
                &lt;span class="n"&gt;sizeHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DownloadTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sizeHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizeHandle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CompareTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;handles&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;AsyncOperationHandle&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Download start: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, size: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; bytes"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DownloadDependenciesAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsDone&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;handle&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;handles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;AsyncOperationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Succeeded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Download failed."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;DownloadTarget&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;Size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;DownloadTarget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="n"&gt;Size&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important point is that &lt;code&gt;WebRequestQueue.SetMaxConcurrentRequests()&lt;/code&gt; controls the number of concurrent downloads, while your own queue controls the order in which downloads are started.&lt;/p&gt;

&lt;p&gt;For example, if the concurrent request limit is 3, even if you start downloads in descending order of size, only up to 3 web requests will run at the same time.&lt;/p&gt;

&lt;p&gt;In short, Addressables bulk downloads become more stable when you think about these three points together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Match the number of concurrent downloads to device performance&lt;/li&gt;
&lt;li&gt;Enqueue download targets from largest to smallest&lt;/li&gt;
&lt;li&gt;Design labels and Bundle splitting together&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Bulk downloads using labels
&lt;/h2&gt;

&lt;p&gt;Addressables allows you to use labels to handle multiple assets as a group.&lt;/p&gt;

&lt;p&gt;For example, if you want to download all assets with the &lt;code&gt;preload&lt;/code&gt; label, you can write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DownloadDependenciesAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, in production, it is usually better to check the download size before starting the download.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetDownloadSizeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"preload"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the assets are already cached, the download size will be &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This allows you to implement behavior such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check whether a download is required&lt;/li&gt;
&lt;li&gt;Show the download size to the user&lt;/li&gt;
&lt;li&gt;Show a Wi-Fi recommendation&lt;/li&gt;
&lt;li&gt;Skip the process if the assets are already downloaded&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sample code for DownloadDependenciesAsync
&lt;/h2&gt;

&lt;p&gt;The following sample checks the download size for a label, then downloads it if necessary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine.AddressableAssets&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine.ResourceManagement.AsyncOperations&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AddressablesPreloader&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SerializeField&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;preloadLabel&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"preload"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Preload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;preloadLabel&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="nf"&gt;Preload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;sizeHandle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetDownloadSizeAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sizeHandle&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizeHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;AsyncOperationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Succeeded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Failed to get download size: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizeHandle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="n"&gt;downloadSize&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sizeHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizeHandle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;downloadSize&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Already downloaded: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Download size: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;downloadSize&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt; bytes"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;downloadHandle&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;DownloadDependenciesAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;downloadHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsDone&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;downloadHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetDownloadStatus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Download progress: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Percent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;P0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;downloadHandle&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="n"&gt;AsyncOperationStatus&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Succeeded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Download completed: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$"Download failed: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Release&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;downloadHandle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this sample, &lt;code&gt;DownloadDependenciesAsync(label, false)&lt;/code&gt; is used, and &lt;code&gt;Addressables.Release(downloadHandle)&lt;/code&gt; is called manually after completion.&lt;/p&gt;

&lt;p&gt;If you want to display progress or check the result, it is easier to manage the lifetime of the handle yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to design labels
&lt;/h2&gt;

&lt;p&gt;A label should be designed as a key that represents which group of assets you want to handle together at runtime.&lt;/p&gt;

&lt;p&gt;For example, you might use labels like these:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Label&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;preload&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Minimum assets required on first launch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scenario_chapter_01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Scenario text, backgrounds, and character sprites used in chapter 1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;event_2026_summer&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assets for a limited-time summer event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;character_hero_001&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Assets for a specific character&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;voice_jp_chapter_01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Japanese voice assets for chapter 1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The important point is to design labels based on the actual loading flow.&lt;/p&gt;

&lt;p&gt;For example, in an ADV or visual-novel-style game, you might use groups such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Common UI required on first launch&lt;/li&gt;
&lt;li&gt;Title screen&lt;/li&gt;
&lt;li&gt;Tutorial&lt;/li&gt;
&lt;li&gt;Scenario assets per chapter&lt;/li&gt;
&lt;li&gt;Backgrounds per chapter&lt;/li&gt;
&lt;li&gt;Character sprites per chapter&lt;/li&gt;
&lt;li&gt;Voice assets per language&lt;/li&gt;
&lt;li&gt;Limited-time events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a game where characters are added over time, labels like these may also work well:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;character_hero_001&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;character_hero_002&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skin_hero_001_summer&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;voice_hero_001_jp&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Label design becomes much easier if you work backward from when the user needs each group of assets.&lt;/p&gt;




&lt;h2&gt;
  
  
  Labels are assigned to assets, but downloads happen per Bundle
&lt;/h2&gt;

&lt;p&gt;This is an easy point to misunderstand.&lt;/p&gt;

&lt;p&gt;Addressables labels are assigned to Addressable assets.&lt;/p&gt;

&lt;p&gt;However, what actually gets downloaded is the AssetBundle.&lt;/p&gt;

&lt;p&gt;:::message alert&lt;br&gt;
A label is a key used to specify which group of assets should be downloaded.&lt;/p&gt;

&lt;p&gt;However, the actual download unit is the AssetBundle.&lt;/p&gt;

&lt;p&gt;So even if you assign a label to an asset, it does not necessarily mean only that specific asset will be downloaded in isolation.&lt;br&gt;
:::&lt;/p&gt;

&lt;p&gt;For example, suppose you have the following setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;A.prefab&lt;/code&gt; has the &lt;code&gt;preload&lt;/code&gt; label&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;B.prefab&lt;/code&gt; does not have the &lt;code&gt;preload&lt;/code&gt; label&lt;/li&gt;
&lt;li&gt;But &lt;code&gt;A.prefab&lt;/code&gt; and &lt;code&gt;B.prefab&lt;/code&gt; are included in the same AssetBundle&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this case, even if you download using the &lt;code&gt;preload&lt;/code&gt; label, the AssetBundle that contains &lt;code&gt;A.prefab&lt;/code&gt; will be downloaded.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;B.prefab&lt;/code&gt; is also included in that same AssetBundle, &lt;code&gt;B.prefab&lt;/code&gt; will effectively be downloaded as well.&lt;/p&gt;

&lt;p&gt;In other words, labels are the entry point for selecting download targets, but the actual file unit that gets downloaded is the AssetBundle.&lt;/p&gt;


&lt;h2&gt;
  
  
  Design labels and Bundle splitting together
&lt;/h2&gt;

&lt;p&gt;Even if your labels are finely designed, the download unit remains large if your Bundles are grouped too broadly.&lt;/p&gt;

&lt;p&gt;On the other hand, if you split Bundles too aggressively, the number of files increases.&lt;/p&gt;

&lt;p&gt;An increased file count can lead to issues such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More requests&lt;/li&gt;
&lt;li&gt;More complex catalog and dependency resolution&lt;/li&gt;
&lt;li&gt;A large number of tiny Bundles&lt;/li&gt;
&lt;li&gt;Higher file lookup and management cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this reason, label design and Bundle splitting should always be considered together.&lt;/p&gt;

&lt;p&gt;For example, assets like ADV or visual-novel-style scenario files often have many small files.&lt;/p&gt;

&lt;p&gt;In that case, splitting every scenario text file, small JSON file, or small configuration file into its own Bundle can create too many files and directly increase download or loading overhead.&lt;/p&gt;

&lt;p&gt;For this kind of data, it is often more stable in practice to group assets by chapter or event.&lt;/p&gt;

&lt;p&gt;On the other hand, assets like character 3D models are often added over time.&lt;/p&gt;

&lt;p&gt;For those, a design close to one Bundle per character may be more suitable.&lt;/p&gt;

&lt;p&gt;If characters are added, updated, or removed on a per-character basis, it is easier to operate when they can be downloaded in that same unit.&lt;/p&gt;

&lt;p&gt;I will cover this in more detail in the next article.&lt;/p&gt;


&lt;h2&gt;
  
  
  Manual label management is error-prone
&lt;/h2&gt;

&lt;p&gt;For small projects, manually managing Addressables from the Addressables Groups window is usually fine.&lt;/p&gt;

&lt;p&gt;However, as the number of assets grows, manual management becomes painful.&lt;/p&gt;

&lt;p&gt;Common problems include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Forgetting to assign labels&lt;/li&gt;
&lt;li&gt;Inconsistent label naming&lt;/li&gt;
&lt;li&gt;Old labels remaining unintentionally&lt;/li&gt;
&lt;li&gt;Address naming rules becoming inconsistent&lt;/li&gt;
&lt;li&gt;Assets being placed in unintended Groups&lt;/li&gt;
&lt;li&gt;Forgetting to clean up assets after an event ends&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This becomes especially problematic in live-service games, where assets increase with each event or new character.&lt;/p&gt;

&lt;p&gt;If every Address and Label is managed manually in that situation, mistakes are almost guaranteed to happen eventually.&lt;/p&gt;

&lt;p&gt;Addressables is powerful, but it can become hard to maintain if your operational rules are unclear.&lt;/p&gt;


&lt;h2&gt;
  
  
  Use Smart Addresser
&lt;/h2&gt;

&lt;p&gt;If you want to manage Address and Label settings through rules, a tool like &lt;a href="https://github.com/CyberAgentGameEntertainment/SmartAddresser" rel="noopener noreferrer"&gt;Smart Addresser&lt;/a&gt; can help a lot.&lt;/p&gt;

&lt;p&gt;Smart Addresser is an Addressables support tool published by CyberAgentGameEntertainment.&lt;/p&gt;

&lt;p&gt;It is not an official Addressables feature, but it can automate management through rules, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic Address assignment&lt;/li&gt;
&lt;li&gt;Automatic Label assignment&lt;/li&gt;
&lt;li&gt;Version management&lt;/li&gt;
&lt;li&gt;Rule validation&lt;/li&gt;
&lt;li&gt;CLI-based application&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Manual management is enough for small projects.&lt;/p&gt;

&lt;p&gt;However, once the number of assets grows, it is safer to generate Address and Label settings from rules instead of assigning them by hand.&lt;/p&gt;

&lt;p&gt;In team development, it is especially important to make sure the same Address and Label settings are generated no matter who works on the assets.&lt;/p&gt;


&lt;h2&gt;
  
  
  Recommended practical setup
&lt;/h2&gt;

&lt;p&gt;In practice, the following setup is easy to operate.&lt;/p&gt;
&lt;h3&gt;
  
  
  Configure concurrent downloads at startup
&lt;/h3&gt;

&lt;p&gt;Call &lt;code&gt;WebRequestQueue.SetMaxConcurrentRequests()&lt;/code&gt; when the app starts.&lt;/p&gt;

&lt;p&gt;Use a fixed value for iOS, and switch based on device performance for Android, depending on your project.&lt;/p&gt;
&lt;h3&gt;
  
  
  Assign the &lt;code&gt;preload&lt;/code&gt; label only to the minimum required assets
&lt;/h3&gt;

&lt;p&gt;Include only the assets required for first launch or the title screen in &lt;code&gt;preload&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If you put too many assets into this label, the initial download becomes heavy.&lt;/p&gt;

&lt;p&gt;It is better to keep &lt;code&gt;preload&lt;/code&gt; limited to assets that are absolutely required at the beginning.&lt;/p&gt;
&lt;h3&gt;
  
  
  Split labels by chapter, event, or character
&lt;/h3&gt;

&lt;p&gt;Design labels based on the loading flow.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scenario_chapter_01
scenario_chapter_02
event_2026_summer
character_hero_001
voice_jp_chapter_01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Labels are easier to manage when they match the actual game progression.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check the download size before downloading
&lt;/h3&gt;

&lt;p&gt;Before a bulk download, use &lt;code&gt;GetDownloadSizeAsync()&lt;/code&gt; to check the size.&lt;/p&gt;

&lt;p&gt;If the size is large, you can show a confirmation dialog or recommend Wi-Fi.&lt;/p&gt;

&lt;p&gt;If the assets are already cached, the size will be &lt;code&gt;0&lt;/code&gt;, so you can skip unnecessary download processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start larger downloads first when downloading multiple targets
&lt;/h3&gt;

&lt;p&gt;If you manage your own download queue for multiple labels or Bundles, start from the largest one.&lt;/p&gt;

&lt;p&gt;This helps avoid the situation where only a huge Bundle remains at the end, reducing the feeling that progress has stalled near the end of the loading screen.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design labels and Bundle splitting together
&lt;/h3&gt;

&lt;p&gt;Even if your labels are cleanly separated, the actual download unit stays large if the Bundle is large.&lt;/p&gt;

&lt;p&gt;On the other hand, splitting Bundles too finely increases the number of files.&lt;/p&gt;

&lt;p&gt;That is why labels and Bundle splitting should be designed together.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;When designing downloads with Addressables, the number of concurrent downloads and label design are important.&lt;/p&gt;

&lt;p&gt;Simply calling &lt;code&gt;DownloadDependenciesAsync&lt;/code&gt; does not determine download speed or operational stability.&lt;/p&gt;

&lt;p&gt;The number of concurrent downloads should not be increased blindly.&lt;/p&gt;

&lt;p&gt;It needs to be tuned based on device performance, network conditions, and Bundle size.&lt;/p&gt;

&lt;p&gt;In my projects, I use 10 on iOS and either 3 or 10 on Android depending on device performance, based on real-device testing.&lt;/p&gt;

&lt;p&gt;Also, when you manage your own queue for multiple download targets, starting from larger Bundles first helps avoid leaving one huge file until the end.&lt;/p&gt;

&lt;p&gt;Labels make bulk downloads easy.&lt;/p&gt;

&lt;p&gt;However, labels are only keys used to select download targets.&lt;/p&gt;

&lt;p&gt;The actual download unit is the AssetBundle.&lt;/p&gt;

&lt;p&gt;For that reason, label design and Bundle splitting should be considered together.&lt;/p&gt;

&lt;p&gt;As the number of assets grows, manual Address and Label management becomes more error-prone.&lt;/p&gt;

&lt;p&gt;In that case, using a rule-based management tool such as Smart Addresser can make operations much easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  Next: Bundle splitting and LZ4/LZMA
&lt;/h2&gt;

&lt;p&gt;In the next article, I will cover Addressables Bundle splitting and compression settings.&lt;/p&gt;

&lt;p&gt;In particular, I plan to cover topics such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether many small files, such as ADV scenario files, should be grouped together&lt;/li&gt;
&lt;li&gt;Whether character 3D models that will increase over time should use one Bundle per character&lt;/li&gt;
&lt;li&gt;Download and lookup overhead caused by increasing the number of files&lt;/li&gt;
&lt;li&gt;The downsides of splitting Bundles too finely&lt;/li&gt;
&lt;li&gt;How to choose between LZ4 and LZMA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bundle splitting is one of the areas where practical Addressables operation differs greatly between projects.&lt;/p&gt;

&lt;p&gt;Next time, I will organize more concrete decision criteria.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>addressables</category>
      <category>assetbundle</category>
    </item>
    <item>
      <title>Fast File Loading Techniques in Unity</title>
      <dc:creator>GameDevToolLab</dc:creator>
      <pubDate>Fri, 19 Jun 2026 11:26:02 +0000</pubDate>
      <link>https://dev.to/gamedevtoollab/fast-file-loading-techniques-in-unity-2131</link>
      <guid>https://dev.to/gamedevtoollab/fast-file-loading-techniques-in-unity-2131</guid>
      <description>&lt;h2&gt;
  
  
  Temporarily Switch to 60 FPS During Loading and Load Multiple Files in Parallel
&lt;/h2&gt;

&lt;p&gt;Even if your main gameplay runs at 30 FPS or another frame rate lower than 60 FPS, temporarily switching to 60 FPS during loading can improve loading times when reading multiple files.&lt;/p&gt;

&lt;p&gt;Also, when loading multiple files, it is more efficient to start all load operations first and then wait for all of them to finish, rather than waiting for each one sequentially.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Threading.Tasks&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine.AddressableAssets&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LoadSample&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;prevFps&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;targetFrameRate&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;prevVSync&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;QualitySettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vSyncCount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Switch to 60 FPS only during loading&lt;/span&gt;
        &lt;span class="n"&gt;QualitySettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vSyncCount&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;targetFrameRate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Start multiple load operations at the same time&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;playerTask&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadAssetAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"Player"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;enemyTask&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadAssetAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"Enemy"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;uiTask&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Addressables&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadAssetAsync&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;"BattleUI"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Wait until all load operations are complete&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WhenAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;playerTask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;enemyTask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uiTask&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;playerPrefab&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;playerTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;enemyPrefab&lt;/span&gt;  &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;enemyTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;uiPrefab&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;uiTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// Restore the FPS settings after loading is complete&lt;/span&gt;
        &lt;span class="n"&gt;Application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;targetFrameRate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prevFps&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;QualitySettings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vSyncCount&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prevVSync&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="nf"&gt;Instantiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;playerPrefab&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;Instantiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enemyPrefab&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;Instantiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uiPrefab&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are two key points.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Start everything first&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;taskA&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;LoadA&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;taskB&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;LoadB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;taskC&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;LoadC&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Then wait for all of them at the end&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WhenAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;taskA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;taskB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;taskC&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you load them sequentially, like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;LoadA&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;LoadB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;LoadC&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the waiting time accumulates.&lt;/p&gt;

&lt;p&gt;On the other hand, if the load operations do not depend on each other, starting them at the same time and waiting for all of them together may reduce the total loading time.&lt;/p&gt;

&lt;p&gt;However, loading many large assets at the same time can increase memory usage or cause spikes during asset expansion, so it is better to group them reasonably by screen or use case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run Network Requests and File Loading at the Same Time
&lt;/h2&gt;

&lt;p&gt;When transitioning to a specific screen, you may need both of the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fetch data from a network API&lt;/li&gt;
&lt;li&gt;Load the prefab used to build the screen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you load the prefab only after the network request finishes, the waiting time is added together.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;apiResult&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;CallApi&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;prefab&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;LoadPrefab&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the network request and the loading process do not depend on each other, it is more efficient to start them at the same time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;apiTask&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;CallApi&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;prefabTask&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;LoadPrefab&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WhenAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;apiTask&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefabTask&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;apiResult&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;apiTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;prefab&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prefabTask&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the waiting time for the network request and the file loading overlaps, you can reduce the amount of time the user has to wait.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>performance</category>
      <category>addressable</category>
    </item>
  </channel>
</rss>
