Version: 6000.3
语言: 中文
应用精简
应用切片

按需资源

按需资源 (ODR) 是 iOS 和 tvOS 的一项功能,可让您减小应用程序的大小。通过将应用程序启动所需的核心资产与可选资产或出现在游戏后期部分的资产分开来实现减少。 这些额外的资产(称为 AssetBundles)可在所有 Unity 构建目标中使用。但是,您必须采取额外的步骤才能让它们在 App Store 上托管。

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

启用按需资源

设置要使用的项目ODR按需资源 (ODR) 是 iOS 和 tvOS 平台的一项功能,从 iOS 和 tvOS 版本 9.0 开始。它允许你通过将核心资产(应用程序启动时需要的资产)与可选的资产或出现在游戏后期关卡中的资产分开来减小应用程序的大小。更多信息
请参阅术语表
,请使用以下步骤:

  1. 导航到 编辑>项目设置(Edit Project Settings) > Player > iOS >其他设置
  2. 在“配置”部分中,启用“使用按需资源”

创建资产包

要创建 AssetBundle,请使用以下步骤:

  1. 创建一个新文件夹,将要放入资产包中的资产分组。为此,请在 项目(Project) 窗口中的 资产(Assets) 文件夹内单击鼠标右键,然后转到 创建>文件夹(Create Folder)。
  2. 为新文件夹命名。
  3. 选择要添加到资产包的资产文件,然后将它们拖到新文件夹中。
  4. 在新文件夹中,创建名为Bundles,ODREditor.

标记 AssetBundle

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

要创建和分配标记,请使用以下步骤:

  1. 选择要对资产进行分组的文件夹。
  2. 检查器一个 Unity 窗口,显示有关当前选定游戏对象、资产或项目设置的信息,允许您检查和编辑值。更多信息
    请参阅术语表
    窗口中,在 资产标签(Asset Labels) 分段中,点击左侧下拉菜单,然后选择 新建(New) 。
  3. 以小写形式输入新标签的名称。

将标签添加到 AssetBundle。

要生成新的AssetBundle文件,你必须在编辑器脚本中引用新标签。要创建编辑器脚本,请执行以下作:

  1. 右键点击 编辑器(Editor) 文件夹,然后选择 创建>单行为脚本(Create MonoBehaviour Script) 。
  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 );
    }

}

上一个代码示例中的以下行采用带有纹理标签标记的文件,并在 Assets/ODR 文件夹中创建一个名为 textures 的 AssetBundle 文件:

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 编辑器菜单栏中创建一个新菜单。转到 捆绑包(Bundle) > 构建iOS AssetBundle,在ODR文件夹中生成AssetBundle。

加载AssetBundle

生成资产包后,必须将它们加载到应用程序中。

在 Assets 文件夹中创建一个名为LoadBundle.cs并复制以下代码示例。此示例脚本下载纹理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 项目

创建并加载资产包后,必须完成以下步骤:

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

其他资源

应用精简
应用切片