Unity 使用C/C++ 跨平臺終極解決方案(PC,iOS,Android,以及支援C/C++的平臺)
阿新 • • 發佈:2019-01-08
PC的其實根本不用說,畢竟C#和C++互動的文章已經夠多了,當然我自認為經過幾次折騰後,幾乎所有遊戲需要到的操作我都掌握了(各種傳參方法,各種坑,不懂的可以留言問,雖然基本上沒人看,哈哈)
廢話不多說,我們主要來講兩大平臺——iOS和android——與unity的native程式碼互動
這裡囉嗦一下就是去網上搜都是各種蛋疼的東西,比如如果要呼叫unity C#的函式怎麼辦,幾乎清一色是給出UnitySendMessage的方法,在專案中用這個簡直是作死,那麼多函式那麼複雜的引數你這個破函式頂個屁用啊。iOS還好說,Android更是坑,居然要你去和java程式碼互動,簡單來說就是C/C++ -》 Java -》C#,而實際上大部分時候你根本不需要這麼蛋疼,直接C/C++ -》C#就可以了,因為C/C++幾乎可以操作所有底層資源,當然個別需求例外
正題
typedef struct Parameter {
int a;
int b;
} Param;
typedef void (*CallBack)(Param* p);
void TestFunc(CallBack cb){
Param p;
p.a = 10;
p.b = 20;
cb(&p);
}
extern “C” 這種細節就不多說了,因為我直接建立的是.c檔案所以不需要這個標記,這裡直接用典型的回撥函式做例子,因為有了回撥,你就不必考慮如何使用C/C++呼叫C#或者反過來,因為這個例子實際上已經包含了資訊的交換
public class NewBehaviourScript : MonoBehaviour { [StructLayout(LayoutKind.Sequential)] struct Parameter { public int a; public int b; } delegate void CallBack(IntPtr param); [DllImport("TestLib")] static extern void TestFunc(CallBack cb); [MonoPInvokeCallback(typeof(CallBack))] static void CallBackFunc(IntPtr param) { var p = (Parameter)Marshal.PtrToStructure(param, typeof(Parameter)); Debug.Log("a:" + p.a + " b:" + p.b); } // Use this for initialization void Start () { TestFunc(CallBackFunc); } // Update is called once per frame void Update () { } }
以上是unity的指令碼,輸出a,b。注意到關鍵沒,對,就是
[MonoPInvokeCallback(typeof(CallBack))]
這個標籤,沒有這個標籤就無法回撥成功。
使用這個方法就可以保證編碼效率和執行效率,你不需要進行各種中間層的封裝,不需把字串轉來轉去,這完全歸功於Mono的跨平臺機制,Unity只是進行了一些簡便操作
另外需要注意的是Android可能需要編譯各種對應的.so,其實用AndroidStudio一下子全部編譯出來然後丟到unity就好了
還有在PC平臺下面不需要這個標籤!
其實如果不是為了保護程式碼,對於unity開發幾乎都可以在C#中完成,C#功能已經足夠強大了,對於