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++几乎可以操作所有底层资源,当然个别需求例外

 

正题

  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#或者反过来,因为这个例子实际上已经包含了信息的交换

  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。注意到关键没,对,就是

  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++的平台)的更多相关文章

  1. HTML5网页录音和上传到服务器,支持PC、Android,支持IOS微信

    准备做一个网页版聊天界面,表情啊.图片啊.上传文件啊都应该要有,视频就算了,语音还是要的. 本文记录的是在网页上用GitHub上的Recorder进行在线录音和上传到服务器,前几天升了一下级,以后有时 ...

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

    PC的事实上根本不用说,毕竟C#和C++交互的文章已经够多了,当然我自觉得经过几次折腾后.差点儿全部游戏须要到的操作我都掌握了(各种传參方法,各种坑,不懂的能够留言问.尽管基本上没人看.哈哈) 废话不 ...

  3. js判断是否是PC,IOS,Android客户端

    写在前面 在项目中使用html5,需要针对不同的客户端浏览器有不一样的处理方式,这就需要对请求中的useragent进行分析,并进行处理. 一个例子 <%@ Page Language=&quo ...

  4. Android大图片裁剪终极解决方案(上:原理分析)

    转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-)  http://my.oschina.net/ryanhoo/blog/86842 约几个月前,我正 ...

  5. Eclipse不自动编译java文件的终极解决方案

    最近我的eclipse经常犯傻,项目中总是有很多,启动项目也是没有启动类.查了下项目中生成的class文件,我靠竟然没有,或者还是以前的.原来是eclipse犯傻了,它没帮我自动编译java文件.一般 ...

  6. Atitit 桌面软件跨平台gui解决方案 javafx webview

    Atitit 桌面软件跨平台gui解决方案 javafx webview 1.1. 双向js交互1 1.2. 新弹出窗口解决1 1.3. 3.文档对象入口dom解析1 1.4. 所以果断JavaFX, ...

  7. 【转】JSP中文乱码问题终极解决方案

    原文地址:http://blog.csdn.net/beijiguangyong/article/details/7414247 在介绍方法之前我们首先应该清楚具体的问题有哪些,笔者在本博客当中论述的 ...

  8. Xcode-调试断点不能停在代码区终极解决方案

    转发 调试断点不能停在代码区终极解决方案:  http://mobile.51cto.com/iphone-390082.htm

  9. VIM、GVIM在WINDOWS下中文乱码的终极解决方案

    文章转自:http://www.liuhuadong.com/archives/68 vim.gvim在windows下中文乱码的终极解决方案在windows下vim的中文字体显示并不好,所以我们需要 ...

随机推荐

  1. java8新特性之Optional类

    NullPointException可以说是所有java程序员都遇到过的一个异常,虽然java从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而java设计者也只能是让指针在java ...

  2. PAT甲1101 Quick Sort

    1101 Quick Sort (25 分) There is a classical process named partition in the famous quick sort algorit ...

  3. POJ2387-Till the cows come home【最短路】

    A - Til the Cows Come Home POJ - 2387 Bessie is out in the field and wants to get back to the barn t ...

  4. Java 中运用DOS运行class(字节码)

    附属: -dir:例举该目录的所有文件名称 有<dir>是文件夹,没有<dir>是文件-cd: 改变目录 进入其他目录 change direction-cd\:一次性回到根目 ...

  5. CONVERT(varchar(10), getdate(), 120 )中数字参数用法

    这是一个mssql数据库的函数,Convert函数的作用,是进行数据类型的转换.而您所问的这个convert(char(20),openDate,120)则是对日期字段,进行格式化转换成字符格式的函数 ...

  6. 51nod 1183 - 编辑距离 - [简单DP][编辑距离问题][Levenshtein距离问题]

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1183 编辑距离,又称Levenshtein距离(也叫做Edi ...

  7. Python面试数据库

    1.列举常见的关系型数据库和非关系型都有那些? 关系型 : MySQL,SQL Server ,Oracle , Sybase, DB2 非关系型 : Redis, MongodDB 2.MySQL常 ...

  8. Numba:高性能Python编译器

    一.简介 Numba是一个开源JIT编译器,它将Python和NumPy代码的子集转换为快速机器代码. 二.主要特点 加速Python功能 Numba使用行业标准的LLVM编译器库在运行时将Pytho ...

  9. 优云亮相GOPS2017全球运维大会 “黑科技”获全场最高关注

    2017年4月21日,GOPS――2017全球运维大会于深圳・圣淘沙酒店拉开帷幕.GOPS全球运维大会由高效运维社区(GreatOPS)和开放运维联盟(OOPSA)联合主办,由工信部信通院数据中心联盟 ...

  10. PULL解析学习

    学习过程   安卓中有三种对XML解析的方式,这个众所周知,DOM,SAX,PULL 其中被推荐的方法是PULL,说是非常简单,但从一开始接触就觉得比较迷惑,总是云里雾里的感觉,甚至在自己写出了一个能 ...