На этой странице описывается, как создавать плагины собственного кода для iOSМобильная операционная система Apple. Подробнее
См. на платформе Словарь.
Создание приложения с собственным подключаемым модулем для iOS
Чтобы создать приложение с помощью собственного подключаемого модуляНабор кода, созданный вне Unity, который создает функциональные возможности в Unity. В Unity можно использовать два типа подключаемых модулей: управляемые подключаемые модули (управляемые сборки .NET, созданные с помощью таких инструментов, как Visual Studio) и собственные подключаемые модули (библиотеки собственного кода для конкретной платформы). Подробнее
см. Словарь для iOS, выполните следующие действия:
Для каждой нативной функции, которую вы хотите вызвать, определите внешний метод в файле C# следующим образом:
[DllImport ("__Internal")] private static extern float FooPluginFunction();
Добавьте исходные файлы собственного кода в проект Unity.
-
Настройте параметры подключаемого модуля в окне Инспектора подключаемых модулей. Например, если ваш нативный код специфичен для iOS, убедитесь, что подключаемый модуль включен только для iOS.
Примечание. Если вы используете C++ (.cpp) или Objective-C++ (.mm) для реализации подключаемого модуля, вы должны объявить функции со связью C, чтобы избежать проблем с искажением имен:
extern "C" {
float FooPluginFunction();
}
Для подключаемых модулей, написанных на C или Objective-C, это не требуется, поскольку эти языки не используют искажение имен.
Использование плагина из C
Ваше приложение может вызывать только нативные подключаемые модули iOSнативную библиотеку кода для конкретной платформы, созданную вне Unity для использовать в единстве. Позволяет вам получить доступ к таким функциям, как вызовы ОС и сторонние библиотеки кода, которые в противном случае были бы недоступны для Unity. Подробнее
См. в Словарь, когда он развернут на реальном устройстве, поэтому вам следует оберните все собственные методы кода дополнительным слоем кода C#. Этот код должен либо использовать условную компиляцию UNITY_IOS && !UNITY_EDITOR
, либо проверять Application.platform
и вызывать собственные методы только тогда, когда приложение работает на устройстве. Простой способ реализовать это:
void MyMethod()
{
#if UNITY_IOS && !UNITY_EDITOR
CallNativeMethodImplementation();
#else
CallEditorMethodImplementation();
#endif
}
Чтобы получить более подробную информацию, загрузите образец браузера Bonjour ниже.
Обратный вызов C# из нативного кода
Unity iOS поддерживает ограниченную функциональность обратного вызова из исходного кода в управляемый. Это можно сделать одним из двух способов:
- Использование
UnitySendMessage
- Через делегатов
Использование UnitySendMessage
Этот вариант проще, но имеет некоторые ограничения. Это выглядит так:
UnitySendMessage("GameObjectName1", "MethodName1", "Сообщение для отправки");
Есть три параметра:
- Имя целевого
GameObject
- Метод скрипта для вызова этого объекта
- Строка сообщения для передачи вызываемому методу
Использование UnitySendMessage
имеет следующие ограничения:
- Из нативного кода можно вызывать только методы скрипта, соответствующие следующей сигнатуре:
void MethodName(string message);
. - Вызовы
UnitySendMessage
являются асинхронными и имеют задержку в один кадр. - Если два или более GameObjectsОсновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки , и более. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь имеют одинаковое имя, это может вызвать конфликты при использованииUnitySendMessage
.
Использование делегатов
Это более сложный вариант. При использовании делегатов метод на стороне C# должен быть статическим и помечен атрибутом MonoPInvokeCallback
. Вы должны передать метод в качестве делегата внешнему методу, который реализован в машинном коде как функция, принимающая указатель на функцию с соответствующей сигнатурой. Указатель функции в машинном коде затем ведет обратно к статическому методу C#.
Код C# для этого метода выглядит следующим образом:
delegate void MyFuncType();
[AOT.MonoPInvokeCallback(typeof(MyFuncType))]
static void MyFunction() { }
static extern void RegisterCallback(MyFuncType func);
Код C, который принимает обратный вызов, выглядит следующим образом:
typedef void (*MyFuncType)();
void RegisterCallback(MyFuncType func) {}
Автоматическая интеграция плагинов
Unity поддерживает автоматическую интеграцию плагинов и копирует все файлы со следующими расширениями в сгенерированный проект Xcode, если вы включили их для iOS в Инспекторе плагиновОкно Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет просматривать и редактировать значения. Дополнительная информация
См. в окне Словарь: .a
, .m
, .mm
, .c
, .cpp
, .h
. Если какие-либо файлы с этими расширениями находятся в папке Assets/Plugins/iOS
, Unity разрешает их только для платформы iOS.
Примечание. После того как файлы будут скопированы в сгенерированный проект Xcode, они больше не будут связаны со своими аналогами в вашем проекте Unity. Если вы измените эти файлы в Xcode, вы должны скопировать их обратно в свой проект Unity. В противном случае Unity перезапишет их при следующем создании проекта.
Советы для iOS:
Вызовы между управляемыми и неуправляемыми устройствами на iOS довольно сильно загружают процессор. Старайтесь не вызывать несколько нативных методов для одного кадра.
Оберните собственные методы дополнительным слоем C#, который вызывает собственный код на устройстве и возвращает фиктивные значения в редакторе.
Строковые значения, возвращаемые собственным методом, должны быть закодированы в кодировке UTF–8 и размещены в куче. Моносортировка вызовов для таких строк бесплатна.
Пример браузера Bonjour
Вы можете скачать простой пример использования подключаемого модуля собственного кода здесь: Пример браузера Bonjour.
В этом примере показано, как можно вызывать код Objective-C из приложения Unity iOS. Это приложение реализует простой клиент Bonjour и состоит из:
- Проект Unity iOS, в котором
Plugins\Bonjour.cs
— это интерфейс C# для собственного кода, аBonjourTest.cs
скрипт, реализующий логику приложения - Собственный код (расположенный в
Assets/Plugins/iOS
), который следует добавить в созданный проект Xcode, как описано в разделе Автоматическая интеграция подключаемых модулей раздел выше