Unity 使用C/C++ 跨平台終極解決方案(PC,iOS,Android,以及支援C/C++的平台)

來源:互聯網
上載者:User

標籤:細節   c/c++   key   send   ram   注意   com   基本   int   

47865741

PC的其實根本不用說,畢竟C#和C++互動的文章已經夠多了,當然我自認為經過幾次折騰後,幾乎所有遊戲需要到的操作我都掌握了(各種傳參方法,各種坑,不懂的可以留言問,雖然基本上沒人看,哈哈)

 

 

 

廢話不多說,我們主要來講兩大平台——iOS和android——與unity的native代碼互動

 

這裡囉嗦一下就是去網上搜都是各種蛋疼的東西,比如如果要調用unity C#的函數怎麼辦,幾乎清一色是給出UnitySendMessage的方法,在項目中用這個簡直是作死,那麼多函數那麼複雜的參數你這個破函數頂個屁用啊。iOS還好說,Android更是坑,居然要你去和java代碼互動,簡單來說就是C/C++ -》 Java -》C#,而實際上大部分時候你根本不需要這麼蛋疼,直接C/C++ -》C#就可以了,因為C/C++幾乎可以操作所有底層資源,當然個別需求例外

 

正題

 

 

[cpp] view plain copy 
  1. typedef struct Parameter {  
  2.     int a;  
  3.     int b;  
  4. } Param;  
  5.   
  6.   
  7. typedef void (*CallBack)(Param* p);  
  8.   
  9. void TestFunc(CallBack cb){  
  10.     Param p;  
  11.     p.a = 10;  
  12.     p.b = 20;  
  13.     cb(&p);  
  14. }  


extern “C” 這種細節就不多說了,因為我直接建立的是.c檔案所以不需要這個標記,這裡直接用典型的回呼函數做例子,因為有了回調,你就不必考慮如何使用C/C++調用C#或者反過來,因為這個例子實際上已經包含了資訊的交換

 

 

 

[csharp] view plain copy 
  1. public class NewBehaviourScript : MonoBehaviour {  
  2.   
  3.     [StructLayout(LayoutKind.Sequential)]  
  4.     struct Parameter {  
  5.        public int a;  
  6.        public int b;  
  7.     }  
  8.   
  9.     delegate void CallBack(IntPtr param);  
  10.   
  11.     [DllImport("TestLib")]  
  12.     static extern void TestFunc(CallBack cb);  
  13.   
  14.     [MonoPInvokeCallback(typeof(CallBack))]  
  15.     static void CallBackFunc(IntPtr param) {  
  16.        var p = (Parameter)Marshal.PtrToStructure(param, typeof(Parameter));  
  17.        Debug.Log("a:" + p.a + " b:" + p.b);  
  18.     }  
  19.   
  20.     // Use this for initialization  
  21.     void Start () {  
  22.         TestFunc(CallBackFunc);  
  23.     }  
  24.       
  25.     // Update is called once per frame  
  26.     void Update () {  
  27.       
  28.     }  
  29. }  


以上是unity的指令碼,輸出a,b。注意到關鍵沒,對,就是

[csharp] view plain copy 
  1. [MonoPInvokeCallback(typeof(CallBack))]  

這個標籤,沒有這個標籤就無法回調成功。

使用這個方法就可以保證編碼效率和執行效率,你不需要進行各種中介層的封裝,不需把字串轉來轉去,這完全歸功於Mono的跨平台機制,Unity只是進行了一些簡便操作

另外需要注意的是Android可能需要編譯各種對應的.so,其實用AndroidStudio一下子全部編譯出來然後丟到unity就好了

還有在PC平台下面不需要這個標籤!

 

其實如果不是為了保護代碼,對於unity開發幾乎都可以在C#中完成,C#功能已經足夠強大了,對於Android保護C#也在上篇文章提到過,雖然個人並不知道安全性如果,唯一的提示就是使用Coroutine之後,反編譯無法看到其過程,但是我並不知道是否只是移到別的地方去了,我個人在把一下敏感資訊放在Coroutine裡面來防止反編譯(雖然可能然並卵)

Unity 使用C/C++ 跨平台終極解決方案(PC,iOS,Android,以及支援C/C++的平台)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.