1. 程式人生 > >Unity 使用C/C++ 跨平臺終極解決方案(PC,iOS,Android,以及支持C/C++的平臺)

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

細節 -h comment 個人 tle lan source 多說 sharp

https://blog.csdn.net/fg5823820/article/details/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. typedef void (*CallBack)(Param* p);
  6. void TestFunc(CallBack cb){
  7. Param p;
  8. p.a = 10;
  9. p.b = 20;
  10. cb(&p);
  11. }


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

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


以上是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++的平臺)