저레벨 네이티브 플러그인 인터페이스 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);

예제 Example

저레벨 렌더링 플러그인의 예는 여기에서 다운로드 받을 수 있습니다. 이것은 모든 일반 렌더링이 끝난 후 단순히 회전하는 삼각형을 C++ 코드로부터 그립니다. 이 프로젝트는 윈도우 (Visual Studio 2008)와 Mac OS X (Xcode 3.2)에서 다 잘 작동하며 윈도우에서는 Direct3D 9, 양쪽 플랫폼 다에서 OpenGL 을 사용합니다. Direct3D 9 프로젝트는 "일어버린(lost)" 기기를 어떻게 다루는지에 대해서도 설명합니다.

역링크