Version: Unity 6.0 (6000.0)
语言 : 中文
应用程序精简
应用程序切片

按需加载资源

按需加载资源 (ODR) 是适用于 iOS 和 tvOS 的功能,可让您减小应用程序的大小。减少方法是将应用程序启动时所需的核心资源与可选或出现在游戏后期的资源分开。这些额外的资源称为 AssetBundle,可用于所有 Unity 构建目标。然而,要将其托管在 App Store 上,需要进行额外的设置。

AssetBundle 可以包含模型、材质、纹理和场景等资产文件,但不能包含脚本。因此,建议将脚本逻辑存储在主应用程序中。最佳做法是将 AssetBundle 的大小限制在 64MB 以内。这有助于减少加载时间和设备存储空间的占用。

启用按需加载资源

要将项目设置为使用__ ODR__按需加载资源 (ODR) 是适用于 iOS 和 tvOS 平台(从 iOS 和 tvOS 9.0 开始)的功能。通过将核心资产(应用程序启动时需要的资产)与可选资产或出现在游戏后期关卡中的资产分开,此功能可以减小应用程序的大小。更多信息
See in Glossary
,请按照以下步骤操作:

  1. 打开编辑 (Edit) > 项目设置 (Project Settings) > 播放器 (Player) > iOS > 其他设置 (Other Settings).
  2. 在配置 (Configuration) 部分中,启用 Use on-demand resources

创建 AssetBundle

要创建 AssetBundle,请按照以下步骤操作:

  1. 首先,创建一个新文件夹,用于存放需要添加到 AssetBundle 的资源。为此,请在项目 (Project) 窗口中的资产 (Assets) 文件夹内右键单击,然后选择创建 (Create) > 文件夹 (Folder)
  2. 为新文件夹命名。
  3. 选择要添加到 AssetBundle 的资产文件,并将它们拖入新文件夹。
  4. 在新文件夹中,再创建三个名为 BundlesODREditor 的子文件夹。

标记 AssetBundle

创建 AssetBundle 时,必须为其分配一个标签,以便在请求 AssetBundle 下载时进行标识。建议使用与 AssetBundle 文件名匹配的标签。

创建和分配标签的步骤如下:

  1. 选择存放资源的文件夹。
  2. 在检视面板窗口中的资源标签 (Asset Labels) 部分中,单击左侧下拉菜单,然后选择 New
  3. 以小写形式输入新标签的名称。

向 AssetBundle 添加标签。

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

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

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

生成 Xcode 项目

完成 AssetBundle 的创建和加载后,需要按照以下步骤操作:

  1. 创建 Xcode 项目。
  2. 在 Xcode 中,导航到构建设置 (Build Settings) > 资产 (Assets)
  3. Embed Asset Packs In Product Bundle 设置为 No,并将 Enable On Demand Resources 设置为 Yes
  4. 构建 iOS App Store 包 (IPA)。
  5. 将 IPA 上传到 App Store Connect 的 TestFlight

其他资源

应用程序精简
应用程序切片
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961