Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Низкоуровневый собственный интерфейс подключаемых модулей

Нативные подключаемые модулиСозданная библиотека собственного кода для конкретной платформы вне Unity для использования в Unity. Позволяет вам получить доступ к таким функциям, как вызовы ОС и сторонние библиотеки кода, которые в противном случае были бы недоступны для Unity. Подробнее
См. Словарь
в Unity может получать обратные вызовы, когда происходят определенные события. Вы можете использовать это для реализации низкоуровневого рендерингапроцесса рисования графики на экране (или текстуры рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
См. Словарь
в вашем плагинНабор кода, созданного вне Unity, который создает функциональные возможности в Unity. В Unity можно использовать два типа подключаемых модулей: управляемые подключаемые модули (управляемые сборки .NET, созданные с помощью таких инструментов, как Visual Studio) и собственные подключаемые модули (библиотеки собственного кода для конкретной платформы). Подробнее
См. в Словарь
, чтобы он мог работать с многопоточным рендерингом Unity.

Реестр интерфейса

Для обработки основных событий Unity подключаемый модуль должен экспортировать функции UnityPluginLoad и UnityPluginUnload. IUnityInterfaces позволяет подключаемому модулю получить доступ к этим функциям, которые можно найти в IUnityInterface.h в 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, который можно найти в файле IUnityGraphics.h, чтобы предоставить подключаемому модулю доступ к общим функциональность графического устройства. Этот сценарий демонстрирует, как можно использовать интерфейс IUnityGraphics для регистрации обратного вызова:

#include "IUnityInterface.h" #include "IUnityGraphics.h" static IUnityInterfaces* s_UnityInterfaces = NULL; static IUnityGraphics* s_Graphics = NULL; static UnityGfxRenderer s_RendererType = kUnityGfxRendererNull; // Unity plugin load event extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces) { s_UnityInterfaces = unityInterfaces; s_Graphics = unityInterfaces->Get(); s_Graphics->RegisterDeviceEventCallback(OnGraphicsDeviceEvent); // Run OnGraphicsDeviceEvent(initialize) manually on plugin load // to not miss the event in case the graphics device is already initialized OnGraphicsDeviceEvent(kUnityGfxDeviceEventInitialize); } // Unity plugin unload event extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload() { s_Graphics->UnregisterDeviceEventCallback(OnGraphicsDeviceEvent); } static void UNITY_INTERFACE_API OnGraphicsDeviceEvent(UnityGfxDeviceEventType eventType) { switch (eventType) { case kUnityGfxDeviceEventInitialize: { s_RendererType = s_Graphics->GetRenderer(); //TODO: user initialization code break; } case kUnityGfxDeviceEventShutdown: { s_RendererType = kUnityGfxRendererNull; //TODO: user shutdown code break; } case kUnityGfxDeviceEventBeforeReset: { //TODO: user Direct3D 9 code break; } case kUnityGfxDeviceEventAfterReset: { //TODO: user Direct3D 9 code break; } }; }

Подключаемые обратные вызовы в потоке рендеринга

Вы можете использовать многопоточность для рендеринга в Unity, если это позволяет платформа и количество доступных ЦП.

Примечание. При использовании многопоточного рендеринга команды API рендеринга выполняются в потоке, который полностью отделен от потока, выполняющего скрипты MonoBehaviour. Кусок кода, позволяющий создавать собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на действия пользователя любым удобным для вас способом. Подробнее
См. в Словарь
. Связь между основным потоком и потоком рендеринга означает, что ваш подключаемый модуль может не начать рендеринг немедленно, в зависимости от того, какой объем работы основной поток передал потоку рендеринга.

Для рендеринга из подключаемого модуля вызовите GL.IssuePluginEvent из управляемый подключаемый модульуправляемая сборка .NET, созданная с помощью таких инструментов, как Visual Studio, для использования в Unity. Подробнее
См. в скрипте Словарь
. Это приводит к тому, что конвейер рендеринга Unity вызывает собственную функцию из потока рендеринга, как показано в примере кода ниже. Например, если вы вызываете GL.IssuePluginEvent из компонента Camera, который создает изображение определенной точки обзора в вашей сцене. Вывод либо рисуется на экране, либо фиксируется в виде текстуры. Подробнее
См. в Словарь
функцию OnPostRender, функция вызовет подключаемый модуль обратный вызов сразу после завершения рендеринга камерой.

Собственный код плагина:

// Plugin function to handle a specific rendering event static void UNITY_INTERFACE_API OnRenderEvent(int eventID) { // User rendering code } // Freely defined function to pass a callback to plugin-specific scripts extern "C" UnityRenderingEvent UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API GetRenderEventFunc() { return OnRenderEvent; }

Managed plug-in code:

#if UNITY_IPHONE && !UNITY_EDITOR [DllImport ("__Internal")] #else [DllImport("RenderingPlugin")] #endif private static extern IntPtr GetRenderEventFunc(); // Queue a specific callback to be called on the render thread GL.IssuePluginEvent(GetRenderEventFunc(), 1);

Подпись для обратного вызова UnityRenderingEvent указана в IUnityGraphics.h в образце собственного подключаемого модуля визуализации.

Подключаемый модуль, использующий графический API OpenGL

Существует два типа объектов OpenGL:

  • Объекты, общие для контекстов OpenGL, такие как текстура, буфер, буфер рендеринга, сэмплеры, запрос, шейдерA программа, работающая на графическом процессоре. Подробнее
    См. в Словарь
    и объектах программы.
  • Объекты контекста OpenGL, такие как массив вершин, буфер кадра, программный конвейер, обратная связь преобразования и объекты синхронизации.

Unity использует несколько контекстов OpenGL. При инициализации и закрытии редактора и проигрывателя Unity полагается на основной контекст, но при рендеринге использует выделенные контексты. Это означает, что вы не можете создавать контекстные объекты во время событий kUnityGfxDeviceEventInitialize и kUnityGfxDeviceEventShutdown.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3