• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Unity使用C/C++跨平台终极解决方案(PC,iOS,Android,以及支持C/C++的平台) ...

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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.   
  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里面来防止反编译(虽然可能然并卵)


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”发布时间:2022-07-13
下一篇:
c++高性能日志库(muduo_AsyncLogging)发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap