オンデマンドリソース (ODR) は、iOS と tvOS で使用可能な機能で、アプリケーションのサイズを削減できます。アプリケーションの起動時から必要なコアアセットと、任意またはゲームですぐに使用しないアセットを分けることでサイズを削減します。アセットバンドル と呼ばれるこれらの追加アセットは、すべての Unity ビルドターゲットで使用できます。ただし、App Store でホストできるようにするには、追加のステップを実行する必要があります。
アセットバンドルにはモデルやマテリアル、テクスチャ、シーンなどのアセットファイルを追加できますが、スクリプトを追加することはできません。そのため、スクリプトロジックはメインアプリケーションに保存します。アセットバンドルのサイズは最大 64MB までにすることが推奨されています。これにより、ロード時間が短縮され、デバイスで使用するストレージスペースを最小化できます。
ODR を使用するようにプロジェクトを設定するには、以下のステップを実行します。
アセットバンドルを作成するには、以下のステップを実行します。
Bundles、ODR、Editor という名前の 3 つのフォルダーを作成します。アセットバンドルを作成する際は、アセットバンドルのダウンロードをリクエストするときに識別できるタグを割り当てる必要があります。アセットバンドルのファイル名と一致するラベルを作成することをお勧めします。
タグを作成して割り当てるには、以下のステップを実行します。

新しいアセットバンドルファイルを生成するには、エディタースクリプトで新しいラベルを参照する必要があります。エディタースクリプトを作成するには以下を実行します。
BuildiOSAssetBundles という名前を付けます。
BuildiOSAssetBundles.cs を開き、以下のコードサンプルをコピーします。この例では、ラベル textures を使用しています。使用したい小文字のラベル名にすべて変更してください。
ノート: この例では非圧縮バンドルを使っています。ただし、これは App Thinning の使用要件ではありません。
using UnityEngine;
using UnityEditor;
public class BuildiOSAssetBundles : MonoBehaviour
{
[InitializeOnLoadMethod]
static void SetupResourcesBuild( )
{
UnityEditor.iOS.BuildPipeline.collectResources += CollectResources;
}
static UnityEditor.iOS.Resource[] CollectResources( )
{
return new UnityEditor.iOS.Resource[]
{
new UnityEditor.iOS.Resource( "textures", "Assets/ODR/textures" ).AddOnDemandResourceTags( "textures" ),
new UnityEditor.iOS.Resource( "bundle", "Assets/Bundles/bundle.unity3d" ).AddOnDemandResourceTags( "bundle" ),
};
}
[MenuItem( "Bundle/Build iOS AssetBundle" )]
static void BuildAssetBundles( )
{
var options = BuildAssetBundleOptions.None;
bool shouldCheckODR = EditorUserBuildSettings.activeBuildTarget == BuildTarget.iOS;
#if UNITY_TVOS
shouldCheckODR |= EditorUserBuildSettings.activeBuildTarget == BuildTarget.tvOS;
#endif
if( shouldCheckODR )
{
#if ENABLE_IOS_ON_DEMAND_RESOURCES
if( PlayerSettings.iOS.useOnDemandResources )
options |= BuildAssetBundleOptions.UncompressedAssetBundle;
#endif
#if ENABLE_IOS_APP_SLICING
options |= BuildAssetBundleOptions.UncompressedAssetBundle;
#endif
}
BuildPipeline.BuildAssetBundles( "Assets/ODR", options, EditorUserBuildSettings.activeBuildTarget );
}
}
上のコードサンプルの以下の行は、textures ラベルでタグ付けされたファイルを取得し、Assets/ODR フォルダー内に textures というアセットバンドルファイルを作成します。
new UnityEditor.iOS.Resource( "textures", "Assets/ODR/textures" ).AddOnDemandResourceTags( "textures" )
デモの目的で、上のコードサンプルには、以下の行も含まれています。この行は、すでにビルドされている (例えば、別のプロジェクトやサードパーティのベンダーから取得した) bundle というアセットバンドルを加えます。
new UnityEditor.iOS.Resource( "bundle", "Assets/Bundles/bundle.unity3d" ).AddOnDemandResourceTags( "bundle" )
このサンプルコード全体によって、Unity エディターのメニューバーに新しいメニューアイテムが作成されます。Bundle > Build iOS AssetBundle の順に選択して、ODR フォルダーにアセットバンドルを生成します。
アセットバンドルを生成したら、アプリケーションにロードする必要があります。
Assets フォルダーに LoadBundle.cs というスクリプトを作成し、以下のコードサンプルをコピーします。以下のスクリプト例は textures ODR アセットバンドルをダウンロードし、パブリックメンバーの TextureBundle に割り当てます。
using UnityEngine;
using UnityEngine.iOS;
using System;
using System.Collections;
public class LoadBundle : MonoBehaviour
{
public AssetBundle TextureBundle;
void Start( )
{
LoadAssetAsync( "textures", "textures" );
}
public async Awaitable LoadAssetAsync( string resourceName, string odrTag )
{
// Create the request
using(OnDemandResourcesRequest request = OnDemandResources.PreloadAsync( new string[] { odrTag } ))
{
// Wait until request is completed
await request;
// Check for errors
if( request.error != null )
throw new Exception( "ODR request failed: " + request.error );
TextureBundle = AssetBundle.LoadFromFile( "res://" + resourceName );
}
}
}
アセットバンドルを作成してロードしたら、以下のステップを実行する必要があります。