Unity 使用C/C++ 跨平台终极解决方案(PC,iOS,Android,以及支持C/C++的平台)
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++几乎可以操作所有底层资源,当然个别需求例外
正题
- 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#功能已经足够强大了,对于Android保护C#也在上篇文章提到过,虽然个人并不知道安全性如果,唯一的提示就是使用Coroutine之后,反编译无法看到其过程,但是我并不知道是否只是移到别的地方去了,我个人在把一下敏感信息放在Coroutine里面来防止反编译(虽然可能然并卵)
Unity 使用C/C++ 跨平台终极解决方案(PC,iOS,Android,以及支持C/C++的平台)的更多相关文章
- HTML5网页录音和上传到服务器,支持PC、Android,支持IOS微信
准备做一个网页版聊天界面,表情啊.图片啊.上传文件啊都应该要有,视频就算了,语音还是要的. 本文记录的是在网页上用GitHub上的Recorder进行在线录音和上传到服务器,前几天升了一下级,以后有时 ...
- Unity 使用C/C++ 跨平台终极解决方式(PC,iOS,Android,以及支持C/C++的平台)
PC的事实上根本不用说,毕竟C#和C++交互的文章已经够多了,当然我自觉得经过几次折腾后.差点儿全部游戏须要到的操作我都掌握了(各种传參方法,各种坑,不懂的能够留言问.尽管基本上没人看.哈哈) 废话不 ...
- js判断是否是PC,IOS,Android客户端
写在前面 在项目中使用html5,需要针对不同的客户端浏览器有不一样的处理方式,这就需要对请求中的useragent进行分析,并进行处理. 一个例子 <%@ Page Language=&quo ...
- Android大图片裁剪终极解决方案(上:原理分析)
转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/86842 约几个月前,我正 ...
- Eclipse不自动编译java文件的终极解决方案
最近我的eclipse经常犯傻,项目中总是有很多,启动项目也是没有启动类.查了下项目中生成的class文件,我靠竟然没有,或者还是以前的.原来是eclipse犯傻了,它没帮我自动编译java文件.一般 ...
- Atitit 桌面软件跨平台gui解决方案 javafx webview
Atitit 桌面软件跨平台gui解决方案 javafx webview 1.1. 双向js交互1 1.2. 新弹出窗口解决1 1.3. 3.文档对象入口dom解析1 1.4. 所以果断JavaFX, ...
- 【转】JSP中文乱码问题终极解决方案
原文地址:http://blog.csdn.net/beijiguangyong/article/details/7414247 在介绍方法之前我们首先应该清楚具体的问题有哪些,笔者在本博客当中论述的 ...
- Xcode-调试断点不能停在代码区终极解决方案
转发 调试断点不能停在代码区终极解决方案: http://mobile.51cto.com/iphone-390082.htm
- VIM、GVIM在WINDOWS下中文乱码的终极解决方案
文章转自:http://www.liuhuadong.com/archives/68 vim.gvim在windows下中文乱码的终极解决方案在windows下vim的中文字体显示并不好,所以我们需要 ...
随机推荐
- MatLab Load cv::Mat 导入数据
我们有时候在项目中需要将OpenCV中的cv::Mat导入MatLab进行分析与处理,那么如果把数据转过去呢,我们的做法是首先将cv::Mat导出为txt文件,或者是yml文件,请参见我之前的博客Wr ...
- mysql bin-logrow模式,base64转正常sql
可以通过以下命令查看日志是否开启查看 show global variables like '%log%'; 当bin-log的模式设置为row时 不仅日志长得快 , 并且查看执行的sql时 , 也稍 ...
- ASP.NET IIS System.UnauthorizedAccessException: 对路径“C:\......xls”的访问被拒绝。
问题: System.UnauthorizedAccessException: 对路径“C:\.....xls”的访问被拒绝. 背景: 项目中用到Excel导出功能,用的是Excel模板的方式来做,意 ...
- HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...
- 数据恢复:AMDU数据抽取恢复
今天我们通过一则真实的案例来认识oracle 自带工具AMDU,无需将磁盘组mount即可实现数据分析,轻松进行数据恢复.某日,我们收到了一则香港用户ASM破坏案例,请求数据恢复.灾难描述:这则案例是 ...
- Java applets A Java applet example
https://en.wikipedia.org/wiki/Ajax_(programming) https://zh.wikipedia.org/wiki/AJAX Ajax (also AJAX; ...
- 系统之锹sysdig:Linux服务器监控和排障利器
当你需要追踪某个进程产生和接收的系统调用时,首先浮现在你脑海中的是什么?你可能会想到strace,那么你是对的.你会使用什么样的命令行工具来监控原始网络通信呢?如果你想到了tcpdump,你又作出了一 ...
- centos7 安装ftp
安装VSFTPD 1.首先确认系统内无VSFTPD. rpm -qa|grep vsftpd 若有的话会显示vsftpd-x.x.x.-x.xxx.x86_64 若没有的话会空返回 2.安装VSFTP ...
- xshell免费下载安装使用
下载链接:https://www.netsarang.com/zh/all-downloads/ 然后点击下载: 然后接下来这一步很关键: 点击免费授权页面,然后填完邮箱会有激活链接,然后就可以下载免 ...
- 新建的web工程找不到javax.servlet.http.httpservlet
1.在出现此错误的项目上右键-->Build Path --> Configure Build Path 2.点击右边的 ADD Library 3.选中“Server Runtime”, ...