按需加载资源 (ODR) 是适用于 iOS 和 tvOS 的功能,可让您减小应用程序的大小。减少方法是将应用程序启动时所需的核心资源与可选或出现在游戏后期的资源分开。这些额外的资源称为 AssetBundle,可用于所有 Unity 构建目标。然而,要将其托管在 App Store 上,需要进行额外的设置。
AssetBundle 可以包含模型、材质、纹理和场景等资产文件,但不能包含脚本。因此,建议将脚本逻辑存储在主应用程序中。最佳做法是将 AssetBundle 的大小限制在 64MB 以内。这有助于减少加载时间和设备存储空间的占用。
要将项目设置为使用__ ODR__按需加载资源 (ODR) 是适用于 iOS 和 tvOS 平台(从 iOS 和 tvOS 9.0 开始)的功能。通过将核心资产(应用程序启动时需要的资产)与可选资产或出现在游戏后期关卡中的资产分开,此功能可以减小应用程序的大小。更多信息
See in Glossary,请按照以下步骤操作:
要创建 AssetBundle,请按照以下步骤操作:
Bundles、ODR 和 Editor 的子文件夹。创建 AssetBundle 时,必须为其分配一个标签,以便在请求 AssetBundle 下载时进行标识。建议使用与 AssetBundle 文件名匹配的标签。
创建和分配标签的步骤如下:

要生成 AssetBundle 文件,需要在编辑器脚本中引用新标签。要创建编辑器脚本:
BuildiOSAssetBundles
打开 BuildiOSAssetBundles.cs,并复制以下代码示例:在此示例中,标签为 textures。请始终使用小写标签名称进行更改。
注意:此示例使用未压缩的 AssetBundle,但这并非应用精简的必要条件。
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 标签的文件会被打包成名为 textures 的 AssetBundle,存放在 Assets/ODR 文件夹中。
new UnityEditor.iOS.Resource( "textures", "Assets/ODR/textures" ).AddOnDemandResourceTags( "textures" )
为了演示,代码还添加了一个已经构建好的名为 bundle 的 AssetBundle(例如来自其他项目或第三方供应商)。
new UnityEditor.iOS.Resource( "bundle", "Assets/Bundles/bundle.unity3d" ).AddOnDemandResourceTags( "bundle" )
整个代码示例将在 Unity 编辑器菜单栏中创建一个新菜单。转到捆绑包 (Bundle) > 构建 iOS AssetBundle (Build iOS AssetBundle) 可在 ODR 文件夹中生成 AssetBundle。
生成 AssetBundle 后,需要将其加载到应用程序中。
在 Assets 文件夹中创建一个名为 LoadBundle.cs 的脚本,并复制以下代码示例:此示例脚本会下载名为 textures 的 ODR AssetBundle,并将其分配给 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 );
}
}
}
完成 AssetBundle 的创建和加载后,需要按照以下步骤操作: