Version: 2019.2
Оптимизация производительности физики
Preparing your application for In-App Purchases (IAP)

Сборка плагина для iOS

На этой странице описан нативный код плагинов для платформы iOS.

Building an application with a native plugin for iOS

1 Определите внешний метод в файле C# следующим образом:

````
[DllImport ("__Internal")]
private static extern float FooPluginFunction();
````
  1. Set the editor to the iOS build target.
  2. Add your native code source files to the generated Xcode project’s Classes folder (this folder is not overwritten when the project is updated, but don’t forget to backup your native code).

If you are using C++ (.cpp) or Objective-C++ (.mm) to implement the plugin you must ensure the functions are declared with C linkage to avoid name mangling issues.

extern "C" {
  float FooPluginFunction();
}

Для плагинов, написанных на C или Objective-C, это не требуется, так как эти языки не используют name-mangling.

Использование ваших плагинов в C#

Нативные плагины iOS могут быть вызваны только на реальном устройстве, поэтому рекомендуется обернуть все нативные методы кода дополнительным слоем C#-кода. Этот код должен проверить Application.platformи вызывать собственные методы только тогда, когда приложение работает на реальном устройстве; фиктивные значения могут быть возвращены из С#-кода при работе в редакторе. Для примера посмотрите приложение Bonjour.

Calling C# back from native code

Unity IOS поддерживает ограниченную функциональность колбэков от нативного к управляемому коду через UnitySendMessage:

UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");

This function has three parameters: the name of the target GameObject, the script method to call on that object and the message string to pass to the called method.

Известные ограничения:

  1. Только методы скриптов, которые соответствуют следующему образцу, могут быть вызваны из нативного кода: function MethodName(message:string)
  2. Вызовы UnitySendMessage являются асинхронными и имеют задержку в один кадр.

Автоматизированная интеграция плагин

Unity iOS supports automated plugin integration in a limited way. All files with extensions .a,.m,.mm,.c,.cpp located in the Assets\Plugins\iOS folder will be merged into the generated Xcode project automatically. However, merging is done by symlinking files from Assets\Plugins\iOS to the final destination, which might affect some workflows. The .h files are not included in the Xcode project tree, but they appear on the destination file system, thus allowing compilation of .m/.mm/.c/.cpp files.

iOS советы

  1. Вызовы от управляемого к неуправляемому коду довольно интенсивно используют процессор на iOS. Старайтесь избегать вызова нескольких нативных методов в кадре.
  2. Как уже упоминалось выше, оберните нативные методы дополнительным слоем C#-кода, который вызывает нативный код на устройстве и возвращает фиктивные значения в редакторе.
  3. String values returned from a native method should be UTF–8 encoded and allocated on the heap. Mono marshalling calls are free for strings like this.
  4. As mentioned above, the Xcode project’s Classes folder is a good place to store your native code because it is not overwritten when the project is updated.
  5. Another good place for storing native code is the Assets folder or one of its subfolders. Just add references from the Xcode project to the native code files: right click on the Classes subfolder and choose Add > Existing files.

Примеры

Пример браузера Bonjour

Простой пример использования нативного кода плагина можно найти здесь

This sample demonstrates how objective-C code can be invoked from a Unity iOS application. This application implements a very simple Bonjour client. The application consists of a Unity iOS project (Plugins\Bonjour.cs is the C# interface to the native code, while BonjourTest.cs is the script that implements the application logic) and native code (Assets\Code) that should be added to the built Xcode project.

Оптимизация производительности физики
Preparing your application for In-App Purchases (IAP)