Нативные подключаемые модулиСозданная библиотека собственного кода для конкретной платформы вне 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
.