Введение в нативный плагин API
Помимо открытых API C# для написания управляемого кода, Unity предоставляет небольшой нативный интерфейс, через который из нативных плагинов можно обращаться к возможностям Unity Editor и движка.
Папка плагина API
Нативные интерфейсы представляют собой набор C или C++ совместимый заголовок (.h) файлы, входящие в состав установки редактора. Файлы находятся в папке PluginAPI папку, которую вы можете найти в следующих местах:
- Windows:
<UnityInstallPath>\Editor\Data\PluginAPI - macOS: Щелкните правой кнопкой мыши приложение Unity и выберите Показать содержимое пакета. Заголовки находятся в
Contents\PluginAPI
Каждый файл заголовка содержит дополнительную документацию в виде комментариев к коду. Дополнительные сведения о начале реализации собственных интерфейсов см. в комментариях к коду в главном файле заголовка IUnityInterface.h.
Совместимость интерфейса
Все Unity нативный плагин API заголовочные файлы совместимы с плагинами, написанными в C++, но только некоторые из них совместимы с плагинами, написанными в C.
Файлы, не совместимые с C, сообщают об ошибке "This file cannot be compiled in a C environment", если вы пытаетесь компилировать их как C.. Вы также найдете соответствующую проверку в исходном файле заголовка:
#ifndef __cplusplus
#error "This file cannot be compiled in a C environment"
#endif
Реестр интерфейса
Для обработки главного Unity событий, плагин должен экспортировать UnityPluginLoad и UnityPluginUnload функции. IUnityInterfaces позволяет плагину получить доступ к этим функциям, которые вы можете найти в IUnityInterface.h в плагине API.
В следующем примере используется IUnityInterfaces для загрузки IUnityGraphics интерфейс в указатель. Это стандартный способ, который можно повторять для загрузки других интерфейсов из API нативных плагинов:
#include "IUnityInterface.h"
#include "IUnityGraphics.h"
// Unity plugin load event
extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API
UnityPluginLoad(IUnityInterfaces* unityInterfaces)
{
IUnityGraphics* graphics = unityInterfaces->Get<IUnityGraphics>();
}