按需资源 (ODR) 是 iOS 和 tvOS 上提供的一项功能,允许您减小应用程序的大小。减小应用程序的大小是通过将应用程序启动所需的核心资源与可选资源或游戏后期出现的资源分离来实现的。这些额外的资源被称为 AssetBundles,可在所有 Unity 构建目标中使用。但是,您需要执行额外的步骤才能在 App Store 上启用它们。
AssetBundles 可以包含 Asset 文件,例如模型、材质、纹理和 场景场景包含游戏的环境和菜单。可以将每个唯一的场景文件视为一个独特的关卡。在每个场景中,您放置环境、障碍物和装饰品,本质上是分段设计和构建游戏。 更多信息
查看 词汇表,但它们不能包含 脚本一段代码,允许您创建自己的组件,触发游戏事件,随时间推移修改组件属性,并以您喜欢的任何方式响应用户输入。 更多信息
查看 词汇表。因此,将您的脚本逻辑存储在主应用程序中。推荐的最佳做法是 AssetBundle 的大小最多为 64MB。这有助于减少加载时间并最大限度地减少设备上使用的存储空间。
要设置项目以使用 ODR按需资源 (ODR) 是 iOS 和 tvOS 平台提供的一项功能,从 iOS 和 tvOS 的 9.0 版开始。它允许您通过将核心资源(从应用程序启动开始就需要的资源)与可能为可选资源或出现在游戏后期关卡中的资源分离来减小应用程序的大小。 更多信息
查看 词汇表,请执行以下步骤。
要创建 AssetBundle,请执行以下步骤。
Bundles
、ODR
和 Editor
的额外文件夹。创建 AssetBundle 时,必须为其分配一个标签,以便在请求下载 AssetBundle 时识别它。建议创建与捆绑包文件名匹配的标签。
要创建和分配标签,请执行以下步骤。
要生成新的 AssetBundle 文件,必须在编辑器脚本中引用新标签。要创建编辑器脚本,
BuildiOSAssetBundles
。打开 BuildiOSAssetBundles.cs
并复制以下代码示例。在此示例中,使用标签 textures
。在整个过程中使用小写形式的标签名称进行替换。
注意:此示例使用未压缩的捆绑包,但这不是使用应用程序瘦身的要求。
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,该 AssetBundle 已经构建,例如,来自另一个项目或第三方供应商。
new UnityEditor.iOS.Resource( "bundle", "Assets/Bundles/bundle.unity3d" ).AddOnDemandResourceTags( "bundle" )
整个代码示例在 Unity 编辑器菜单栏中创建了一个新菜单。转到 捆绑包 > 构建 iOS AssetBundle 以在 ODR 文件夹中生成 AssetBundles。
生成 AssetBundles 后,必须将它们加载到应用程序中。
在 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 );
}
}
}
创建和加载 AssetBundles 后,必须完成以下步骤。