1. 程式人生 > >Unity中的C#與C++互動

Unity中的C#與C++互動

原始碼demo
演示了一個渲染三角形的例子
C++部分程式碼實現了對底層API的封裝以及核心功能實現。

RenderingPlugin.cpp中定義了C++的介面。其中定義了一系列全域性變數,使用者通過介面函式對這些全域性變數賦值。如:
設定紋理

// --------------------------------------------------------------------------
// SetTextureFromUnity, an example function we export which is called by one of the scripts.

static
void* g_TextureHandle = NULL; static int g_TextureWidth = 0; static int g_TextureHeight = 0; extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API SetTextureFromUnity(void* textureHandle, int w, int h) { // A script calls this at initialization time; just remember the texture pointer here.
// Will update texture pixels each frame from the plugin rendering event (texture update // needs to happen on the rendering thread). g_TextureHandle = textureHandle; g_TextureWidth = w; g_TextureHeight = h; }

Plugin裝載與解除安裝

static IUnityInterfaces* s_UnityInterfaces = NULL;
static
IUnityGraphics* s_Graphics = NULL; extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginLoad(IUnityInterfaces* unityInterfaces) { s_UnityInterfaces = unityInterfaces; s_Graphics = s_UnityInterfaces->Get<IUnityGraphics>(); s_Graphics->RegisterDeviceEventCallback(OnGraphicsDeviceEvent); // Run OnGraphicsDeviceEvent(initialize) manually on plugin load OnGraphicsDeviceEvent(kUnityGfxDeviceEventInitialize); } extern "C" void UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API UnityPluginUnload() { s_Graphics->UnregisterDeviceEventCallback(OnGraphicsDeviceEvent); }

渲染執行緒的回撥函式

static void UNITY_INTERFACE_API OnRenderEvent(int eventID)
{
    // Unknown / unsupported graphics device type? Do nothing
    if (s_CurrentAPI == NULL)
        return;

    DrawColoredTriangle();
    ModifyTexturePixels();
    ModifyVertexBuffer();
}


// --------------------------------------------------------------------------
// GetRenderEventFunc, an example function we export which is used to get a rendering event callback function.

extern "C" UnityRenderingEvent UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API GetRenderEventFunc()
{
    return OnRenderEvent;
}

DrawColoredTriangle是渲染的處理函式,分別針對不同的底層API進行封裝,如

RenderAPI_D3D11.cpp
RenderAPI_D3D12.cpp
RenderAPI_OpenGL2.cpp

引用dll中的方法

    // We'll also pass native pointer to a texture in Unity.
    // The plugin will fill texture data from native code.
#if (UNITY_IPHONE || UNITY_WEBGL) && !UNITY_EDITOR
    [DllImport ("__Internal")]
#else
    [DllImport ("RenderingPlugin")]
#endif
    private static extern void SetTextureFromUnity(System.IntPtr texture, int w, int h);

#if (UNITY_IPHONE || UNITY_WEBGL) && !UNITY_EDITOR
    [DllImport ("__Internal")]
#else
    [DllImport("RenderingPlugin")]
#endif
    private static extern IntPtr GetRenderEventFunc();

呼叫C++中的SetTextureFromUnity函式

    private void CreateTextureAndPassToPlugin()
    {
        // Create a texture
        Texture2D tex = new Texture2D(256,256,TextureFormat.ARGB32,false);
        // Set point filtering just so we can see the pixels clearly
        tex.filterMode = FilterMode.Point;
        // Call Apply() so it's actually uploaded to the GPU
        tex.Apply();

        // Set texture onto our material
        GetComponent<Renderer>().material.mainTexture = tex;

        // Pass texture pointer to the plugin
        SetTextureFromUnity (tex.GetNativeTexturePtr(), tex.width, tex.height);
    }

渲染執行緒註冊C++的回撥函式

private IEnumerator CallPluginAtEndOfFrames()
    {
        while (true) {
            // Wait until all frame rendering is done
            yield return new WaitForEndOfFrame();

            // Set time for the plugin
            SetTimeFromUnity (Time.timeSinceLevelLoad);

            // Issue a plugin event with arbitrary integer identifier.
            // The plugin can distinguish between different
            // things it needs to do based on this ID.
            // For our simple plugin, it does not matter which ID we pass here.
            GL.IssuePluginEvent(GetRenderEventFunc(), 1);
        }
    }

相關推薦

UnityC#C++互動

原始碼demo 演示了一個渲染三角形的例子 C++部分程式碼實現了對底層API的封裝以及核心功能實現。 RenderingPlugin.cpp中定義了C++的介面。其中定義了一系列全域性變數,使用者通過介面函式對這些全域性變數賦值。如: 設定紋理

UnityC#C++交互<微信牛牛源碼

ets main rom new ref enume manually apply 渲染 演示了一個渲染三角形的例子 微信牛牛源碼(h5.hxforum.com) 聯系方式170618633533企鵝2952777280 微信Tel17061863533 源碼出售,平臺出租

在 Cef 實現 C++ JavaScript 互動場景分析

此文已由作者鄧佳佳授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗 本文主要介紹 CEF 場景中 C++ 和 JavaScript 互動(以下簡稱 JS Bridge)中的一些重要節點,包括了 C++/JavaScript 的方法註冊、方法呼叫、回撥管理。以下是一些

在 Mac Webview Objective-c JS 互動

http://blog.eqoe.cn/posts/mac-webview-js-oc.html 本文為您圖文演示如何在 OC 中註冊或執行 JS 函式,以實現網頁與程式的互動。 1. 首先我們建立一個 XCode 專案; 2. 新增WebView 到ViewContro

C++QML互動2:在QML呼叫C++特性

版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。 本文連結:https:/

CC++的函數聲明省略參數的不同意義

style clu nts 這一 too spa 好奇心 函數聲明 fun 一直都以為C/C++中形如 int func(); 這樣的函數聲明其意義就是一個參數 void(沒有參數)的函數。然而今天在看C++的時候突然看到這麽一句: 對於帶空參數表的函數,

【總結】C++C#的static靜態修飾符

this sea const 數據 一切都 UC 限制 有一個 字段 重點 靜態類(sealed+abstract) 靜態構造函數(無參,無限制符,自動執行一次) 靜態變量(類級別,實例無關,靜態存儲區中) 靜態方法(不能被重寫) 靜態局部變量(始終存在) 靜態本質是實

【2018.05.05 CC++】C++的自動廢料收集:概念問題引入

自己 ont 大量 閱讀 帶來 int OS 修改 htm 在閱讀C++語言的設計與演化一書時,作者多次提到希望能設計出一個自動廢料收集,然而出於種種考慮,始終未將自動廢料收集納入標準討論中,而是由Coder自己考慮是否在程序中實現廢料收集。 當然了,許多Java-Code

cc++輸出字符指針和字符串指針的問題

cout 指針 inux 問題 執行 格式 一個 輸出 [] 首先搞清楚在c語言中沒有字符串的類型,所以對字符串操作,有兩種形式:可以用字符指針,或者字符串數組(這裏的指針變量c,系統會為其重新分配內存。 c程序示例: 1 #include <stdio.h&g

C++】CC++ const常量 - 修改時報錯

#include <stdio.h> #define PAUSE printf("Press Enter key to continue - By WangLei ..."); fgetc(stdin); int main() { const int n = 10; // &

C#java互動匯入EXCEL

採用webservice與java互動: 大致思路:  通過C#來獲取檔案, 將檔案讀取為BYTE[] ,然後通過webservice 將其傳入java後代,然後去解析EXCEL; Excel 如下: C#端程式碼:

C++Lua互動1: C++呼叫lua

lua作為一門動態語言,可用來當做配置檔案和實現經常變化的業務功能,很方便的實現熱更新。同時lua作為一門膠水語言,配合強大的C++作邏輯支撐,程式效能高、開發效率快,猶如珠簾合璧,所向無敵。C++與lua的互動主要通過lua的虛擬棧實現,本文不打算深入講解其

Android JNIJavaC++物件如何建立一一對應的關係

Android JNI中Java與C++物件如何建立一一對應的關係 環境 系統:Mac OSX IDE:android studio 3.0 1.JAVA物件持有C++物件的指標 在java類中建立long型別的變數如(long mNativeStudent )

Singleton模式在C#C++的實現

     Singleton應該可以算是GOF的23個模式中最簡單的一個模式了,它有兩個要求:一是保證一個類僅有一個例項;二是提供一個訪問它的全域性訪問點。這在實現中分別對應為:一是建構函式非public;二是提供一個靜態函式作為全域性訪問點。  在C#中,我們可以這麼寫: publicclas

工大助手(C#python互動

工大助手(爬蟲——C#與python互動) 基本內容 工大助手(桌面版) 實現登陸、查成績、計算加權平均分等功能 團隊人員 13070046 孫宇辰 13070003 張帆 13070004 崔巍 13070006 王奈 13070002 張雨帆 13070045 汪天米 工大教務爬蟲編寫(C#與py

const在CC++的區別

  在C中,const不是常量,只能說是一個不能改變的變數(注意是變數),C編譯器不能把const看成看成一個編譯期間的常量,因為他在記憶體中有分配,C編譯器不知道他在編譯期間的值。所以不能作為陣列定義時的下標,因為它必須為常量。   在C中,const int a;是可以的,因為這只是宣告一個變數,告訴編

Unity3DjsC#之間相互呼叫的解決辦法

轉載自:http://www.manew.com/3102.html Unity3D中一些指令碼的方法只能用在JS中,在C#中是無效的,而C#可以與伺服器端通訊,JS本身卻不行。而且,如果需要用到js呼叫c#的問題,js會比c#先編譯,所以在mac裡編譯ios的時候會出錯,

Python格式化使用%C prinf格式輸出的區別

一.格式 1.1 C printf()的一般格式    printf(格式控制,輸出列表);    例:int i = 3;        double f = 4.56;        printf("%d,%f", i,f); 1.2  PYTHON 格式化輸出    格式標記字串 % 要輸出的值組  

NDK學習:CC++在Ndk的區別

使用C++做ndk 某些程式碼簡單一些原因是 他給你封裝了一個 env結構體 #include<stdio.h> #include"cn_itcast_cpp_DemoActivity.h" #include <android/log.h> #inc

CC++的static的關鍵詞的作用

這裡分成兩個方面來講: 1.對於C語言 原則一:只用進行一次初始化 但是有一個原則必須講,static所儲存的位置: 還是把一個程序進行的位置放出: .text:指的是程式碼段 .data和.bss是我們要重點討論的段: 這兩個段儲存著我們全域