При создании проекта Unity для iOSмобильной операционной системы Apple. Подробнее
На платформе Словарь Unity создает папку, содержащую проект Xcode. Этот проект нужен для компиляции и подписания вашего приложения перед его развертыванием на устройстве. Вам также необходимо использовать его для подготовки и сборки вашей игры для распространения в App Store. Структура проекта Xcode изменилась по сравнению с Unity 2019.3 и теперь поддерживает интеграцию Unity с собственными приложениями iOS через Unity as a Library.
Прежде чем создавать проект для iOS, убедитесь, что вы установили идентификатор пакета в настройках проигрывателя iOS** (меню: Правка > Настройки проекта > Настройки проигрывателя). Вы также можете выбрать, нацелено ли ваше приложение на симулятор или на реальное устройство. Для этого измените поле версия SDK**.
Цели проекта
Каждый созданный проект Unity iOS Xcode имеет следующую структуру и цели:
- UnityFramework: часть библиотеки в целевом объекте UnityFramework. Он включает папки Classes, UnityFramework и Libraries, а также зависимые фреймворки, и Xcode использует его для создания UnityFramework.framework. файл.
-
Unity-iPhone: тонкая часть пусковой установки в цели Unity-iPhone. Он включает папку MainApp и данные представления приложения, такие как экраны запуска, файлы .xib, значки, данные и файлы /Info.plist, и он запускает библиотеку. Цель Unity-iPhone имеет одну зависимостьВ контексте диспетчера пакетов зависимость конкретная версия пакета (выраженная в форме
имя_пакета@версия_пакета
), которая требуется проекту или другому пакету для работы. Проекты и пакеты используют атрибут dependencies в своих манифестах для определения набора требуемых пакетов. Для проектов это считается прямой зависимостью; для пакетов это косвенные или транзитивные зависимости. Подробнее
См. в Словаре цель UnityFramework.
Папка классов
Папка Classes содержит код, объединяющий среду выполнения Unity и Objective-C. Unity хранит точки входа приложения в файлах main.mm и UnityAppController.mm/h внутри этой папки. Вы можете создать свой собственный AppDelegate, производный от UnityAppController, или, если какой-либо из ваших плагиновнабор кода, созданный вне Unity который создает функциональность в Unity. В Unity можно использовать два типа подключаемых модулей: управляемые подключаемые модули (управляемые сборки .NET, созданные с помощью таких инструментов, как Visual Studio) и собственные подключаемые модули (библиотеки собственного кода для конкретной платформы). Подробнее
См. в Словарь, включая AppController.h , вы можете вместо этого включить UnityAppController.h. Если ваша папка Plugins/iOS содержит_ AppController.mm/h_, вы можете объединить и переименовать их.
Файл InternalProfiler.h также определяет условие компилятора для включения внутреннего Profilerокна который поможет вам оптимизировать вашу игру. Он показывает, сколько времени вы тратите на различные области вашей игры. Например, он может сообщать о проценте времени, затраченном на рендеринг, анимацию или игровую логику. Дополнительная информация
См. в Словарь. Код в этой папке не часто меняется, и вы можете размещать здесь пользовательские классы. Если вы выберете режим Append, Xcode сохранит изменения в этой папке между сборками. Однако эта функция не поддерживает несколько целей сборки и требует фиксированной структуры папки Libraries.
Внутренний профилировщик Unity работает быстро и ненавязчиво и предоставляет основную информацию о:
- Какая подсистема занимает большую часть времени кадра.
- Размер кучи .NET.
- Количество и продолжительность событий GC.
Дополнительную информацию см. в документации по встроенному профилировщику.
Папка данных
Эта папка содержит сериализованные ресурсы вашего приложения, а также сборки .NET (файлы .dll или .dat) либо в виде полного кода, либо в виде метаданных, в зависимости от настроек удаления кода. Файл machine.config настраивает различные службы .NET, такие как безопасность и WebRequest. Xcode обновляет содержимое этой папки при каждой сборке. Вы не должны вносить в него никаких изменений.
По умолчанию Target Membership папки Data является целью Unity-iPhone, и среда выполнения Unity ищет ее в основной пакет
. Чтобы изменить пакет по умолчанию, в котором Unity Runtime ищет папку Data, вызовите setDataBundleId: "com.my.product"
в экземпляре UnityFramework, прежде чем вызывать одна из функций запуска. Например, если вы хотите иметь Данные вместе с вызовом UnityFramework, используйте setDataBundleId: "com.unity3d.framework"
и задайте Целевое членство в UnityFramework.
Примечание. Ресурсы по требованию поддерживаются только в том случае, если папка Data является частью целевого приложения, а не частью целевого объекта UnityFramework.
Папка "Библиотеки"
Папка Libraries содержит libil2cpp.a для IL2CPPA Разработанный Unity сервер сценариев, который вы можете использовать в качестве альтернативы Mono при создании проектов для некоторых платформ. Подробнее
См. в Словарь. Файл libiPhone-lib.a представляет собой статическую библиотеку среды выполнения Unity, а файл RegisterMonoModules.cpp связывает собственный код Unity с .NET. Xcode и обновляет содержимое этой папки при каждой сборке. Вы не должны вносить в него никаких изменений.
Пользовательские папки
Вы можете разместить здесь свои пользовательские файлы.
Графические файлы
Значки и заставки (файлы .png) находятся в каталогах активов в папке Unity-iPhone. Unity автоматически управляет этими файлами. Экраны запуска, их конструкторы интерфейсов XML (файлы .xib) и файлы раскадровки хранятся в корневой папке проекта. Чтобы настроить их в Unity, используйте окно Player Настройки (меню: Edit > Project Settings > Player Settings). Когда вы создаете собственные образы запуска, убедитесь, что они соответствуют Руководство по пользовательскому интерфейсу.
Файл со списком свойств (.plist)
Вы можете управлять файлом /Info.plist в целевом устройстве Unity-iPhone (доступ через mainBundle
) из настроек проигрывателя Unity (меню: Правка > Настройки проекта > Настройки проигрывателя, затем выберите раздел Другое и прокрутите вниз до раздела Идентификация; подробности см. в документации по Настройки проигрывателя iOS — идентификация). Когда Unity создает Player, он обновляет этот файл, а не заменяет его. Не вносите в него изменения, если в этом нет необходимости.
Файл /UnityFramework/Info.plist (доступ через bundleWithIdentifier:@"com.unity3d.framework"
) является частью UnityFramework. Вы можете хранить значения здесь, а не в файле /Info.plist mainBundle, чтобы быть уверенными, что вы сможете получить эти значения, если UnityFramework переместится в другое приложение.
Другие файлы
К ним относятся файл проекта Xcode (файл .xcodeproj) и ссылки на фреймворк, которые отображаются только в Навигаторе проектов.
Создание проекта Xcode с помощью xcodebuild
Когда вы используете аргументы командной строки для указания параметров сборки, они влияют на все цели проекта Xcode. Чтобы предотвратить это, некоторые параметры сборки имеют версии с суффиксом, которые вы можете использовать, чтобы указать, на какую цель влияют ваши параметры сборки. Это реализовано с помощью пользовательских настроек (суффикс *APP, используемый для целевого приложения, и суффикс *FRAMEWORK для целевого объекта платформы).
При сборке с помощью xcodebuild используйте версии с суффиксом для:
PRODUCT_NAME -> PRODUCT_NAME_APP
PROVISIONING_PROFILE -> PROVISIONING_PROFILE_APP
PROVISIONING_PROFILE_SPECIFIER -> PROVISIONING_PROFILE_SPECIFIER_APP
OTHER_LDFLAGS -> OTHER_LDFLAGS_FRAMEWORK
В зависимости от вашего пользовательского конвейера сборки вы можете расширить список, включив в него другие настройки.
Изменение проекта Xcode
Чтобы изменить сгенерированный проект Xcode, используйте Xcode.PBXProject.
Цели проекта
Начиная с Unity 2019.3, PBXProject.GetUnityTargetName
и pbxProject->TargetGuidByName("Unity-iPhone")
устарели. Вместо этого вы можете использовать либо pbxProject->GetUnityFrameworkTargetGuid()
, либо pbxProject->GetUnityMainTargetGuid()
:
// Obsolete
string targetGuid = proj.TargetGuidByName("Unity-iPhone");
string targetGuid = proj.TargetGuidByName(PBXProject.GetUnityTargetName());
// Instead call one of these
string targetGuid = proj.GetUnityFrameworkTargetGuid();
string targetGuid = proj.GetUnityMainTargetGuid();
Если вам необходимо поддерживать как старые, так и новые пути кода в вашем пакете или пользовательском постпроцессоре сборки, выполните следующие действия:
- По возможности используйте возможности модуля импорта плагинов (например, чтобы указать дополнительные платформы).
- Используйте отражение:
string mainTargetGuid;
string unityFrameworkTargetGuid;
var unityMainTargetGuidMethod = proj.GetType().GetMethod("GetUnityMainTargetGuid");
var unityFrameworkTargetGuidMethod = proj.GetType().GetMethod("GetUnityFrameworkTargetGuid");
if (unityMainTargetGuidMethod != null && unityFrameworkTargetGuidMethod != null)
{
mainTargetGuid = (string)unityMainTargetGuidMethod.Invoke(proj, null);
unityFrameworkTargetGuid = (string)unityFrameworkTargetGuidMethod.Invoke(proj, null);
}
else
{
mainTargetGuid = proj.TargetGuidByName ("Unity-iPhone");
unityFrameworkTargetGuid = mainTargetGuid;
}