목차
저레벨 네이티브 플러그인 인터페이스 Low-level Native Plugin Interface
기본적인 스크립트 인터페이스에다가 추가적으로, 어떤 이벤트가 일어났을때 유니티의 네이티브 코드 플러그인은 콜백(callbacks)을 받을수 있습니다. 이것은 대부분 저레벨 렌더링을 사용자의 플러그인에서 수행하고 그것을 유니티의 멀티쓰레드 렌더링과 같이 작동하게 하기 위할때 사용합니다.
그래픽 장치로의 접근 Access to the Graphics Device
플러그인은 UnitySetGraphicsDevice 함수를 내보내기 (export) 함으로써 그래픽 장치 이벤트들에 관한 알림을 받을 수 있습니다. 이것은 그래픽 장치가 생성되거나, 그것이 부서지기 전이나, 장치가 리셋(이것은 Direct3D 9에만 해당) 되기 전후에 호출될 것입니다. 이 함수는 장치 포인터, 장치 종류, 일어나는 이벤트의 종류를 받을 매개변수를 가집니다.
// 만약 플러그인에 의해 내보내졌다면, 이 함수는 그래픽 장치가 생성되거나, 부서지거나, // 리셋되기 전후로 (예, 해상도 변경) 불려올 것입니다. extern "C" void EXPORT_API UnitySetGraphicsDevice (void* device, int deviceType, int eventType);
deviceType를 위한 가능한 값들:
enum GfxDeviceRenderer { kGfxRendererOpenGL = 0, // OpenGL kGfxRendererD3D9 = 1, // Direct3D 9 kGfxRendererD3D11 = 2, // Direct3D 11 kGfxRendererGCM = 3, // Sony PlayStation 3 GCM kGfxRendererNull = 4, // "null" device (used in batch mode) kGfxRendererHollywood = 5, // Nintendo Wii kGfxRendererXenon = 6, // Xbox 360 kGfxRendererOpenGLES = 7, // OpenGL ES 1.1 kGfxRendererOpenGLES20Mobile = 8, // OpenGL ES 2.0 mobile variant kGfxRendererMolehill = 9, // Flash 11 Stage3D kGfxRendererOpenGLES20Desktop = 10, // OpenGL ES 2.0 desktop variant (i.e. NaCl) };
eventType을 위한 가능한 값들:
enum GfxDeviceEventType { kGfxDeviceEventInitialize = 0, kGfxDeviceEventShutdown = 1, kGfxDeviceEventBeforeReset = 2, kGfxDeviceEventAfterReset = 3, };
렌더링 쓰레드에 플러그인 콜백 Plugin Callbacks on the Rendering Thread
만약 플랫폼과 사용 가능한 CPU가 허용한다면 유니티에서의 렌더링은 멀티쓰레드(Multithread)로 가능합니다. 멀티쓰레드 렌더링이 사용될 때, 렌더링 API 명령어는 MonoBehaviour 스크립트로부터 완전히 떨어진 쓰레드에서 일어납니다. 결과적으로 렌더 쓰레드가 그때 하고 있는 무엇인가를 방해할지도 모르기 때문에 사용자의 플러그인이 바로 렌더링을 시작하게 하는 것이 항상 가능한 것은 아닙니다.
플러그인에서 렌더링을 하기 위해서는 플러그인이 렌더 쓰레드에서 불러오게 할 GL.IssuePluginEvent 를 사용자의 스크립트에서 호출해야 합니다. 예를 들어 만약 카메라의 OnPostRender 함수로부터 GL.IssuePluginEvent 를 호출한다면, 카메라가 렌더링을 끝내는 순간 사용자는 바로 플러그인 콜백을 받게 될 것입니다.
// 만약 플러그인에 의해 export 되었다면, 이 함수는 GL.IssuePluginEvent 스크립트 콜을 위해 불려질 것입니다. // 이 함수는 렌더링 쓰레드로 불려질 것입니다. 멀티쓰레드 렌더링이 사용될 때는 // 렌더 쓰레드는 모든 스크립트들과 기타 게임 로직들이 실행되는 메인 쓰레드와는 다르다는 것을 명심하세요! // 사용자는 일어나고 있는 다른 플러그인 스크립트 콜과 필요한 어떤 동기화에 대해서도 확실히 체크해야 합니다. extern "C" void EXPORT_API UnityRenderEvent (int eventID);