啊,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...