版本:Unity 6 (6000.0)
语言:英语
应用程序瘦身
应用程序切片

按需资源

按需资源 (ODR) 是 iOS 和 tvOS 上提供的一项功能,允许您减小应用程序的大小。减小应用程序的大小是通过将应用程序启动所需的核心资源与可选资源或游戏后期出现的资源分离来实现的。这些额外的资源被称为 AssetBundles,可在所有 Unity 构建目标中使用。但是,您需要执行额外的步骤才能在 App Store 上启用它们。

AssetBundles 可以包含 Asset 文件,例如模型、材质、纹理和 场景场景包含游戏的环境和菜单。可以将每个唯一的场景文件视为一个独特的关卡。在每个场景中,您放置环境、障碍物和装饰品,本质上是分段设计和构建游戏。 更多信息
查看 词汇表
,但它们不能包含 脚本一段代码,允许您创建自己的组件,触发游戏事件,随时间推移修改组件属性,并以您喜欢的任何方式响应用户输入。 更多信息
查看 词汇表
。因此,将您的脚本逻辑存储在主应用程序中。推荐的最佳做法是 AssetBundle 的大小最多为 64MB。这有助于减少加载时间并最大限度地减少设备上使用的存储空间。

启用按需资源

要设置项目以使用 ODR按需资源 (ODR) 是 iOS 和 tvOS 平台提供的一项功能,从 iOS 和 tvOS 的 9.0 版开始。它允许您通过将核心资源(从应用程序启动开始就需要的资源)与可能为可选资源或出现在游戏后期关卡中的资源分离来减小应用程序的大小。 更多信息
查看 词汇表
,请执行以下步骤。

  1. 导航到 编辑 > 项目设置 > 播放器 > iOS > 其他设置
  2. 在配置部分,启用 使用按需资源

创建 AssetBundle

要创建 AssetBundle,请执行以下步骤。

  1. 创建一个新文件夹,将要放入 AssetBundle 的资源分组在一起。为此,右键单击项目窗口中的 资源 文件夹,然后转到 创建 > 文件夹
  2. 为新文件夹命名。
  3. 选择要添加到 AssetBundle 的资源文件,然后将它们拖到新文件夹中。
  4. 在新文件夹中,创建三个名为 BundlesODREditor 的额外文件夹。

标记 AssetBundle

创建 AssetBundle 时,必须为其分配一个标签,以便在请求下载 AssetBundle 时识别它。建议创建与捆绑包文件名匹配的标签。

要创建和分配标签,请执行以下步骤。

  1. 选择正在分组资源的文件夹。
  2. 检查器一个 Unity 窗口,显示有关当前选定游戏对象、资源或项目设置的信息,允许您检查和编辑值。 更多信息
    查看 词汇表
    窗口的 资源标签 部分,单击左侧下拉菜单并选择 新建
  3. 以小写形式输入新标签的名称。

Add a tag to an AssetBundle.

要生成新的 AssetBundle 文件,必须在编辑器脚本中引用新标签。要创建编辑器脚本,

  1. 右键单击编辑器文件夹,然后选择 创建 > MonoBehaviour 脚本
  2. 将新脚本命名为 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。

加载 AssetBundle

生成 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 );
        }
    }
}

生成 Xcode 项目

创建和加载 AssetBundles 后,必须完成以下步骤。

  1. 创建一个 Xcode 项目
  2. 在 Xcode 中,导航到 构建设置 > 资源
  3. 将资源包嵌入产品捆绑包中 设置为 ,并将 启用按需资源 设置为
  4. 构建 iOS App Store 包 (IPA)。
  5. 将 IPA 上传到 App Store Connect 的 TestFlight

其他资源

应用程序瘦身
应用程序切片