应用程序切片允许根据运行应用程序的设备规格动态下载资源。例如,应用程序切片可以为大屏幕设备下载高分辨率资源,为小屏幕设备下载低分辨率资源。这是通过定义 AssetBundles 并添加变体来实现的。您可以在启动时决定使用哪种变体,并在下载时自动将其附加到资源文件名。
要创建变体,请使用以下步骤:
BuildiOSAppSlices.cs 的新脚本。textures 和变体 hd 和 sd 替换为您自己的代码。在此代码示例中,引用了多个文件夹:一个包含高清纹理,一个包含标准清晰度纹理。它们分别被赋予了变体 hd 和 sd。using UnityEngine;
using UnityEditor;
public class BuildiOSAppSlices : 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").BindVariant( "Assets/ODR/textures.hd", "hd" )
.BindVariant( "Assets/ODR/textures.sd", "sd" )
.AddOnDemandResourceTags( "textures" ),
};
}
[MenuItem( "Bundle/Build iOS App Slices" )]
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 );
}
}
这段代码将在 Unity 编辑器菜单栏中创建一个名为 Bundle 的新菜单。单击该菜单并选择构建 iOS 应用程序切片 (Build iOS App Slices)。此时将在 ODR 文件夹中生成 AssetBundles。
要加载资源,请在 Assets 文件夹中创建一个名为 LoadBundle.cs 的脚本文件,然后复制以下代码。将 textures 替换为要加载的变体的名称。
using UnityEngine;
using UnityEngine.iOS;
using System;
using System.Collections;
public class LoadBundle : MonoBehaviour
{
public AssetBundle TextureBundle;
void Start( )
{
LoadAssetAsync( "textures", "textures" );
}
public IEnumerator LoadAsset( 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 );
}
}
}
有时,您可能希望在特定设备或内存超出设定限制的设备上使用特定变体。为此,您可以更改所使用的每个变体的设置。
要修改变体,请导航到播放器设置 (Player Settings) > 其他设置 (Other Settings) > 配置 (Configuration) 并展开应用切片变体映射 (Variant map for app slicing)。
注意:在播放器设置 (Player Settings) > 其他 (Other) > 配置 (Configuration) 中启用使用按需加载资源 (Use on demand resources) 可以查看应用切片变体映射选项。
| 设置 | 描述 | |
|---|---|---|
| Variant name | 显示加载脚本中变体的名称。 | |
| 设备 | 选择此变体所针对的设备。 | |
| 内存 | 选择此变体所需的最小内存。 | |
| 图形 | 选择要与此变体一起使用的金属框架。 | |
| Display color space | 选择要用于此变体的色域。 | |
| 添加自定义条目 | 单击添加自定义条目 (Add custom entry) 以添加您自己的自定义设置和值。 | |
| 键 | 输入该设置的名称。 | |
| 值 | 输入该设置的值。 | |