Unity 使用C/C++ 跨平台终极解决方式(PC,iOS,Android,以及支持C/C++的平台)
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++的平台)的更多相关文章
- Unity 使用C/C++ 跨平台终极解决方案(PC,iOS,Android,以及支持C/C++的平台)
https://blog.csdn.net/fg5823820/article/details/47865741 PC的其实根本不用说,毕竟C#和C++交互的文章已经够多了,当然我自认为经过几次折腾后 ...
- 用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)
本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.a ...
- Android Studio安装更新终极解决方式
之前写过一篇Android SDK无法更新的博文,其实该方式对Android Studio同样有效,大伙可以下载网盘中分享的小软件,若搜索到通道后提示需要更细,也可以选择更新.参考:http://bl ...
- vim、gvim在windows下中文乱码的终极解决方式
測试成功,完美解决. 仅仅需改动VIM文件夹以下的这个文件_vimrc. 加油吧,骚年.非常强大的! set encoding=utf-8 set fileencodings=utf-8,chines ...
- QT5 Failed to load platform plugin "windows" 终极解决方式 命令行问题
Failed to load platform plugin "windows" 这个错误在双击exe运行时不会出现,当传递命令行參数时出问题 ,解决方法: int main(in ...
- 在Eclipse的kepler中执行OSGIproject出错的解决方式
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/canlets/article/details/29620301 今天学习OSGI的过程中依照书上所述 ...
- 使用AndroidStudio编译NDK的方法及错误解决方式
參考资料: [android ndk]macos环境下Android Studio中利用gradle编译jni模块及配置:http://demo.netfoucs.com/ashqal/article ...
- GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本号系统解决方式
项目开发中须要使用GridView批处理操作,多项选择. 可是GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本号. 找 ...
- 【iOS开发-27】解决方式:An error was encountered while running(Domain=FBSOpenApplicationErrorDomain, Code=4)
iOS simulator出现故障,提示: An error was encountered while running (Domain = FBSOpenApplicationErrorDomain ...
随机推荐
- 想要学好C/C++,我到底要看多少书才能成为一个合格的C/C++工程师?
如何学好C语言 这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子.比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便 ...
- Spark Streaming概述
Spark Streaming是一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力. 其中包括:资源管理框架,Apache YARN.Apache Mesos:基于内存的 ...
- RecyclerView的基础用法
为了让RecyclerView可以在所有的Android版本中都能使用,Android开发团队将RecyclerView定义在support.v7包当中.在使用该控件时需要打开当前Modile的bui ...
- js-内置对象及相关语法
1:如图(视频截取的) this指的是当前标签的对象. var ary=new Array("mark","jay","leslie"); ...
- oracle排序union和union all区别
是这样的,表格中有几个属性,比如age吧是之一,age是字符类型的数字,select之间由union连接,此时是无法对前面的select语句进行order by的,也就是无法排序,无法达成我要的按ag ...
- 配置 Sybase数据源
1.Start-- > All Programs -- > Sybase - -> Connectivity --> click ‘Open Client Directory ...
- 三维重建:SLAM相关的一些术语解释
SLAM是一个工程问题,再次复习一下工程中可能用到的名词解释. 还是不要看了,高翔的科普读物已经出版了,读他的<slam十四讲>就可以了. 一.度量相关: 世界坐标系:描述图像的平面坐标系 ...
- [Intermediate Algorithm] - Drop it
题目 队友该卖就卖,千万别舍不得. 当你的队伍被敌人包围时,你选择拯救谁.抛弃谁非常重要,如果选择错误就会造成团灭. 如果是AD或AP,优先拯救. 因为AD和AP是队伍输出的核心. 其次应该拯救打野. ...
- Mysql分组求和&LIMIT
分组求和mysql> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY na ...
- 一个完整的jmeter APP登录接口测试实例
最终效果: 知识点: 通过HTTP信息头管理器, 正则表达式提取器 提取登录要用的token,memcard,Debug Sampler,CSV Data set config参数化登录,循环控制器 ...