Apple Store и iOS оптимизируют установку приложений для iOS, tvOS и watchOS, адаптируя доставку приложений к возможностям конкретного устройства пользователя. Эта оптимизация называется истончением приложений. Прореживание приложений позволяет создавать приложения, которые используют большинство функций устройства, занимают минимум места на диске и поддерживают будущие обновления, которые может применить Apple. Узнайте больше об этом процессе оптимизации на странице библиотеки разработчиков Apple в приложении. Истончение.
В этой главе описываются два основных компонента прореживания приложений, которые можно реализовать в Unity:
Ресурсы по запросу (ODR) — это функция, доступная для платформ iOS и tvOS, начиная с версии 9.0 iOS и tvOS. Это позволяет вам уменьшить размер вашего приложения, отделив основные активы (те, которые необходимы при запуске приложения) от активов, которые могут быть необязательными или которые появляются на более поздних уровнях вашей игры. Эти дополнительные активы называются AssetBundles. Они доступны для всех целевых сборок Unity, но необходимо предпринять дополнительные шаги, чтобы разрешить их размещение через App Store.
AssetBundles может содержать файлы ресурсов, такие как модели, материалы, текстуры и сценыСцена содержит окружение и меню вашей игры. . Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь, но они не могут включать скриптыФрагмент кода, позволяющий создавать собственные компоненты, запускать игровые события, изменять свойства компонентов с течением времени и реагировать на действия пользователя в любой как вам нравится. Подробнее
См. в Словарь. Это означает, что вся ваша логика сценариев должна находиться в основном приложении. Apple рекомендует, чтобы размер пакета AssetBundle не превышал 64 МБ, чтобы сократить время загрузки (особенно по беспроводной сети) и свести к минимуму объем дискового пространства, используемого на устройстве.
Настройка ODR
Чтобы настроить проект для ODR, сначала убедитесь, что в качестве типа сборки выбран iOS. В строке меню выберите Файл > Настройки сборки.
Если он еще не выбран, нажмите iOSмобильная операционная система Apple. Подробнее
См. в Словарь, затем нажмите кнопку Switch Платформа. Затем нажмите Настройки игрокаНастройки, которые позволяют вам установить различные параметры для конкретного игрока для окончательной игры, созданной Unity. Подробнее
Посмотреть в кнопке Словарь. В Инспектореокне Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет вам проверять и редактировать ценности. Подробнее
Посмотрите в окне Словарь, откройте Другие настройки, перейдите в раздел Конфигурация и установите флажок Использовать ресурсы по требованию.
Создание AssetBundle
Сначала создайте новую папку, чтобы сгруппировать активы, которые вы хотите поместить в AssetBundle. Для этого щелкните правой кнопкой мыши в окне проекта и выберите Создать > Папка (или нажмите Создать > Папка в левом верхнем углу окна проекта).
Выберите файлы активов, которые вы хотите добавить в AssetBundle, затем перетащите их в новую папку.
При создании AssetBundle необходимо присвоить ему тег, который используется в качестве идентификатора при запросе загрузки AssetBundle. Хорошей практикой является создание метки, соответствующей имени файла пакета; это обеспечивает уникальный ярлык и упрощает его распознавание, когда вы будете работать с ним позже.
Чтобы создать или назначить тег, выберите новую папку и перейдите к разделу «Ярлыки объектов» в нижней части окна «Инспектор». Нажмите раскрывающееся меню слева, выберите Создать и введите имя нового ярлыка. Обратите внимание, что метки AssetBundle должны быть в нижнем регистре.
В этом примере папка с именем Textures получает новую метку
Чтобы сгенерировать новый файл AssetBundle, на новую метку должна быть ссылка в сценарии редактора. Чтобы создать сценарий редактора, создайте новую папку в окне проекта с именем Editor. Щелкните правой кнопкой мыши папку Editor и выберите Создать > Сценарий C#. Назовите новый скрипт BuildiOSAssetBundles.cs.
В этом примере папке Textures был присвоен ярлык textures. Новый скрипт BuildiOSAssetBundles.cs создан в папке Editor.
Откройте 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, и создает файл AssetBundle с именем textures в Assets/ODR. папка:
new UnityEditor.iOS.Resource( "textures", "Assets/ODR/textures" ).AddOnDemandResourceTags( "textures" )
В демонстрационных целях приведенный выше пример кода также включает следующую строку, которая добавляет AssetBundle с именем bundle, который уже был создан, например, из другого проекта или стороннего поставщика:
new UnityEditor.iOS.Resource( "bundle", "Assets/Bundles/bundle.unity3d" ).AddOnDemandResourceTags( "bundle" )
Во всем примере кода создается новое меню в строке меню редактора Unity. Перейдите в раздел Bundle > Сборка iOS AssetBundle. При этом в папке ODR создаются пакеты AssetBundles.
Следующий скрипт загружает пакет ODR Asset Bundle textures, назначая его общедоступному элементу TextureBundle. Разместите это где-нибудь в своем проекте.
using UnityEngine;
using UnityEngine.iOS;
using System;
using System.Collections;
public class LoadBundle : MonoBehaviour
{
public AssetBundle TextureBundle;
void Start( )
{
StartCoroutine( LoadAsset( "textures", "textures" ) );
}
public IEnumerator LoadAsset( string resourceName, string odrTag )
{
// Create the request
OnDemandResourcesRequest request = OnDemandResources.PreloadAsync( new string[] { odrTag } );
// Wait until request is completed
yield return request;
// Check for errors
if( request.error != null )
throw new Exception( "ODR request failed: " + request.error );
TextureBundle = AssetBundle.LoadFromFile( "res://" + resourceName );
request.Dispose( );
}
}
Следующим шагом является создание проекта Xcode, создание .IPA и загрузка его в TestFlight iTunes Connect. В рамках процедуры обработки TestFlight встроенные пакеты ODR AssetBundles удаляются из приложения и размещаются на серверах Apple, готовые к загрузке.
Перед созданием .IPA в Xcode проверьте в настройках сборки XCode, чтобы убедиться, что в разделе "Активы" для параметра Встроить пакеты ресурсов в набор продуктов установлено значение Нет. , а для параметра Включить ресурсы по запросу установлено значение Да.
После того как iTunes Connect завершит загрузку вашего приложения, щелкните версию сборки в TestFlight Builds, чтобы просмотреть дополнительную информацию о ней:
Разделение приложений
Нарезка приложений аналогична процессу предоставления ресурсов по запросу, что позволяет динамически загружать ресурсы в соответствии со спецификацией устройства, на котором запущено приложение (например, загружать ресурсы с высоким разрешением для iPad с сетчаткой и с низким разрешением). Активы для небольших устройств, таких как iPhone и iPad Mini). Это достигается путем определения AssetBundles с добавлением вариантов. Таким образом, вы можете решить при запуске, какой вариант использовать, и автоматически добавить его к имени файла актива при загрузке.
Чтобы создать вариант, щелкните новую папку и перейдите к разделу Ярлыки объектов в нижней части окна Инспектора. Нажмите на раскрывающееся меню справа, выберите Новый и введите название нового варианта. Обратите внимание, что варианты AssetBundle должны быть в нижнем регистре.
Новый вариант должен быть указан в сценарии редактора. Чтобы создать сценарий редактора, создайте новую папку в окне проекта с именем Editor. Щелкните правой кнопкой мыши папку Editor и выберите Создать > Сценарий C#. Назовите новый скрипт BuildiOSAppSlices.cs.
Скопируйте и вставьте приведенный ниже код, заменив ярлык («текстуры») и варианты («hd» и «sd») своими собственными. В этом примере кода упоминается несколько папок: одна содержит 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. При этом в папке ODR создаются пакеты AssetBundles.
Затем, чтобы загрузить актив, поместите этот класс где-нибудь в свой проект и передайте имя варианта, который вы хотите загрузить:
using UnityEngine;
using UnityEngine.iOS;
using System;
using System.Collections;
public class LoadBundle : MonoBehaviour
{
public AssetBundle TextureBundle;
void Start( )
{
StartCoroutine( LoadAsset( "textures", "textures" ) );
}
public IEnumerator LoadAsset( string resourceName, string odrTag )
{
// Create the request
OnDemandResourcesRequest request = OnDemandResources.PreloadAsync( new string[] { odrTag } );
// Wait until request is completed
yield return request;
// Check for errors
if( request.error != null )
throw new Exception( "ODR request failed: " + request.error );
TextureBundle = AssetBundle.LoadFromFile( "res://" + resourceName );
request.Dispose( );
}
}
Теперь вы можете просматривать и изменять варианты в разделе Настройки проигрывателя > Другие настройки > Конфигурация в раскрывающемся меню Карта вариантов для разделения приложения (меню отображается, только если Использование ресурсов по запросу включено в настройках проигрывателя).
Чтобы узнать больше об AssetBundles и ресурсах по требованию, см. демонстрационный проект AssetBundle Manager Unity, размещен на Bitbucket. На целевой странице содержится исчерпывающее описание того, как использовать и настраивать демоверсию.