Membangun plug-ins untuk platform desktop
Ekstensi rendering plug-in asli tingkat rendah

Antarmuka plug-in asli tingkat rendah

Native Plug-insPerpustakaan kode asli spesifik platform yang diciptakan di luar Unity untuk digunakan di Unity. Memungkinkan Anda dapat mengakses fitur seperti panggilan OS dan perpustakaan kode pihak ketiga yang tidak akan tersedia untuk Unity. More info
Lihat di Glossary
dalam Unity dapat menerima callback ketika peristiwa tertentu terjadi. Anda dapat menggunakan ini untuk menerapkan rendering tingkat rendah di plug-inSatu set kode yang dibuat di luar Unity yang menciptakan fungsi dalam Unity. Ada dua jenis plug-ins yang dapat Anda gunakan di Unity: Managed plug-ins (diproduksi. Rakitan NET dibuat dengan alat-alat seperti Studio Visual) dan plug-ins asli (pustaka kode asli yang spesifik platform). More info
Lihat di Glossary
Anda sehingga dapat bekerja dengan rendering multithreaded Unity.

Daftar Antarmuka

Untuk menangani acara Unity utama, plug-in harus mengekspor fungsi UnityPluginLoad dan UnityPluginUnload. IUnityInterfaces memungkinkan plug-in untuk mengakses fungsi ini, yang dapat Anda temukan di IUnityInterface.h di API plug-in:

#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>();
}

Akses ke perangkat grafis

Gunakan antarmuka IUnityGraphics, yang dapat Anda temukan di IUnityGraphics.h, untuk memberikan akses plug-in ke fungsi perangkat grafis generik. Script ini menunjukkan bagaimana Anda dapat menggunakan antarmuka IUnityGraphics untuk mendaftarkan callback:

#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<IUnityGraphics>();
        
    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;
        }
    };
}

Plug-in callback pada benang rendering

Anda dapat menggunakan multithreading untuk render di Unity, jika platform dan jumlah CPU yang tersedia memungkinkan untuk itu.

Note: Ketika Anda menggunakan rendering multithreaded, perintah API rendering terjadi pada benang yang benar-benar terpisah dari benang yang berjalan MonoBehaviour scriptsSepotong kode yang memungkinkan Anda untuk membuat Komponen Anda sendiri, memicu peristiwa permainan, memodifikasi sifat komponen dari waktu ke waktu dan menanggapi input pengguna dengan cara apa pun yang Anda sukai. More info
Lihat di Glossary
. Komunikasi antara benang utama dan benang render berarti bahwa plug-in Anda mungkin tidak mulai rendering segera, tergantung pada berapa banyak pekerjaan benang utama telah mendorong benang render.

Untuk membuat dari plug-in, panggilan GL.IssuePluginEvent dari skrip managed plug-inSitemap Perakitan NET yang dibuat dengan alat seperti Visual Studio untuk digunakan di Unity. More info
Lihat di Glossary
Anda. Ini menyebabkan pipa rendering Unity untuk memanggil fungsi asli dari benang render, seperti yang ditunjukkan dalam contoh kode di bawah ini. Contohnya, jika Anda memanggil GL. MasalahPluginEvent dari fungsi OnPostRender CameraKomponen yang menciptakan gambar sudut pandang tertentu di tempat kejadian Anda. Output ditarik ke layar atau ditangkap sebagai tekstur. More info
Lihat di Glossary
, fungsi akan memanggil callback plug-in segera setelah kamera telah selesai rendering.

Kode plugin asli:

// 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;
}

Dikelola plug-in kode:

#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);

Tanda tangan untuk callback UnityRenderingEvent disediakan dalam IUnityGraphics.h dalam sampel Plugin rendering Asli.

Plug-in menggunakan API grafis OpenGL

Ada dua jenis benda OpenGL:

  • Objects shared across OpenGL contexts, seperti tekstur, penyangga, renderbuffer, sampler, query, shaderProgram yang berjalan di GPU. More info
    Lihat di Glossary
    , dan objek program.
  • Per-OpenGL context objects, seperti array simpul, bingkaibuffer, saluran program, mengubah umpan balik, dan benda sinkronisasi.

Unity menggunakan beberapa konteks OpenGL. Ketika menginisialisasi dan menutup Editor dan Pemain, Bersatu bergantung pada konteks master, tetapi ketika rendering menggunakan konteks khusus. Ini berarti Anda tidak dapat membuat objek per-konteks selama peristiwa kUnityGfxDeviceEventInitialize dan kUnityGfxDeviceEventShutdown.


• 2017–05–16 Login

Membangun plug-ins untuk platform desktop
Ekstensi rendering plug-in asli tingkat rendah