關於在Unity3D中使用C DLL庫的記錄

2021-08-30 17:42:29 字數 1940 閱讀 7439

啊,long time no see...大概又是很久沒有更新部落格了。好訊息是我今天正式收到了轉正郵件了。

最近get到了乙個新技能,就是在u3d中調我們自己寫的c++的庫。之前也有用到過,但都是導師來接好了,沒有自己研究過。現將內容記錄如下。

1. 關於unity中匯入外部庫,在pc端和安卓端

pc端使用的是c++  test.dll, 安卓端使用的是 libtest.so. 其中安卓端的庫是以lib開頭,在unity指令碼中不需要單獨處理。

檔案組織:

—plugins

——android

————libtest.so

——test.dll

2.接庫

[dllimport("test")]

static extern int creat(intptr hmemmgr, ref intptr phengine);

3.c++ 和 c#之間的資料型別對應以傳輸資料方式

如,c++端定義了乙個空指標

void* handle = null;
在c# 中使用intptr.zero對應

intptr handle = intptr.zero;
如,c++端有如下結構體a

struct a

這裡主要用到marshal.allochglobal為指標分配記憶體,和marshal.freehglobal()釋放

dangdangdang...

struct a

//分配了記憶體,需要釋放

public void release()

}

定義好了c#端的結構體後,就可以為這個指標所指向的記憶體賦值,並將這個a結構體物件傳到c++的函式中。

主要是對給指標分配的這塊記憶體進行劃分,另起乙個指標,不斷的對這塊記憶體賦值,並移動一定的位置,主要用到的是

marshal.structuretoptr()函式

a a;

a.init();

long longptr = a.points.toint64();

long longptr1 = a.states.toint64();

for(int i = 0; i < num; ++i)

//傳入外部函式

setpoints(ref a);

a.release();

其實整體和上面差不多,不過這裡分享一下對於比較複雜的結構體,比如乙個結構體內還包含了另乙個結構體

c++中有結構體a,a的定義如上

struct b

c#中的定義:

public struct b

public void release()

}

在c#中獲取c++傳來的b, 主要用到的就是下面這個方法去將unmanaged資料,轉換成c#中的結構體,下面這個方法親測有效。

核心是marshal.ptrtostructure()

public static void marshalunmananagedarray2struct(intptr unmanagedarray, int length, out t mangagedarray)

}

使用方法如下: 

a alist;

b b;

b.init(num);

//c++中的方法

getb(ref b);

marshalunmananagedarray2struct(b.pointslist, (int)b.num, out alist);

b.release();

主要的內容就是這樣啦~記錄完畢...

Unity3d中使用Profiler除錯裝置的方法

其實搞完了以後發現還是比較簡單的,但是有幾點比較注意的地方 一.使用unity做android開發,一定要切記備份android的開發環境,也就是sdk。因為一旦更新sdk,有可能造成sdk內的檔案結構改變,那麼unity無法正確找到檔案的話,build的時候就會不斷的報錯。雖然網上有各種解決辦法,...

Unity3D中使用KiiCloud總結一

kii cloud目前包含以下七大功能 使用者管理 不需要設定伺服器或編寫任何乙個api,即可管理您的使用者。資料分析 生成任何你能想象的會話 事件 度量和資料分析。賺取利潤 厭倦了低點選轉化率?獲取您應得的利潤吧。訊息推送 向使用者和應用程式推送操作手冊 資料和api產生的通知。地理定位 利用豐富...

在Unity3d中使用GZip來壓縮傳輸資料

因為unity中的.net支援是有限制的,所以c 自帶的gzip的壓縮方法不能夠使用。引入頭部 using icsharpcode.sharpziplib using icsharpcode.sharpziplib.gzip 以下 實現了壓縮和解壓的方法 memorystream ms new me...