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.  
  6. typedef void (*CallBack)(Param* p);
  7.  
  8. void TestFunc(CallBack cb){
  9. Param p;
  10. p.a = 10;
  11. p.b = 20;
  12. cb(&p);
  13. }

extern “C” 这样的细节就不多说了,由于我直接建立的是.c文件所以不须要这个标记,这里直接用典型的回调函数做样例,由于有了回调。你就不必考虑怎样使用C/C++调用C#或者反过来,由于这个样例实际上已经包括了信息的交换

  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。

注意到关键没,对,就是

  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. Unity 使用C/C++ 跨平台终极解决方案(PC,iOS,Android,以及支持C/C++的平台)

    https://blog.csdn.net/fg5823820/article/details/47865741 PC的其实根本不用说,毕竟C#和C++交互的文章已经够多了,当然我自认为经过几次折腾后 ...

  2. 用c/c++混合编程方式为ios/android实现一个自绘日期选择控件(一)

    本文为原创,如有转载,请注明出处:http://www.cnblogs.com/jackybu 前言 章节: 1.需求描述以及c/c++实现日期和月历的基本操作 2.ios实现自绘日期选择控件 3.a ...

  3. Android Studio安装更新终极解决方式

    之前写过一篇Android SDK无法更新的博文,其实该方式对Android Studio同样有效,大伙可以下载网盘中分享的小软件,若搜索到通道后提示需要更细,也可以选择更新.参考:http://bl ...

  4. vim、gvim在windows下中文乱码的终极解决方式

    測试成功,完美解决. 仅仅需改动VIM文件夹以下的这个文件_vimrc. 加油吧,骚年.非常强大的! set encoding=utf-8 set fileencodings=utf-8,chines ...

  5. QT5 Failed to load platform plugin "windows" 终极解决方式 命令行问题

    Failed to load platform plugin "windows" 这个错误在双击exe运行时不会出现,当传递命令行參数时出问题 ,解决方法: int main(in ...

  6. 在Eclipse的kepler中执行OSGIproject出错的解决方式

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/canlets/article/details/29620301 今天学习OSGI的过程中依照书上所述 ...

  7. 使用AndroidStudio编译NDK的方法及错误解决方式

    參考资料: [android ndk]macos环境下Android Studio中利用gradle编译jni模块及配置:http://demo.netfoucs.com/ashqal/article ...

  8. GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本号系统解决方式

    项目开发中须要使用GridView批处理操作,多项选择. 可是GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本号. 找 ...

  9. 【iOS开发-27】解决方式:An error was encountered while running(Domain=FBSOpenApplicationErrorDomain, Code=4)

    iOS simulator出现故障,提示: An error was encountered while running (Domain = FBSOpenApplicationErrorDomain ...

随机推荐

  1. 想要学好C/C++,我到底要看多少书才能成为一个合格的C/C++工程师?

    如何学好C语言 这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子.比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便 ...

  2. Spark Streaming概述

    Spark Streaming是一种构建在Spark上的实时计算框架,它扩展了Spark处理大规模流式数据的能力. 其中包括:资源管理框架,Apache YARN.Apache Mesos:基于内存的 ...

  3. RecyclerView的基础用法

    为了让RecyclerView可以在所有的Android版本中都能使用,Android开发团队将RecyclerView定义在support.v7包当中.在使用该控件时需要打开当前Modile的bui ...

  4. js-内置对象及相关语法

    1:如图(视频截取的) this指的是当前标签的对象. var ary=new Array("mark","jay","leslie"); ...

  5. oracle排序union和union all区别

    是这样的,表格中有几个属性,比如age吧是之一,age是字符类型的数字,select之间由union连接,此时是无法对前面的select语句进行order by的,也就是无法排序,无法达成我要的按ag ...

  6. 配置 Sybase数据源

    1.Start-- > All Programs -- > Sybase - -> Connectivity --> click ‘Open Client Directory ...

  7. 三维重建:SLAM相关的一些术语解释

    SLAM是一个工程问题,再次复习一下工程中可能用到的名词解释. 还是不要看了,高翔的科普读物已经出版了,读他的<slam十四讲>就可以了. 一.度量相关: 世界坐标系:描述图像的平面坐标系 ...

  8. [Intermediate Algorithm] - Drop it

    题目 队友该卖就卖,千万别舍不得. 当你的队伍被敌人包围时,你选择拯救谁.抛弃谁非常重要,如果选择错误就会造成团灭. 如果是AD或AP,优先拯救. 因为AD和AP是队伍输出的核心. 其次应该拯救打野. ...

  9. Mysql分组求和&LIMIT

    分组求和mysql> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY na ...

  10. 一个完整的jmeter APP登录接口测试实例

    最终效果: 知识点: 通过HTTP信息头管理器, 正则表达式提取器 提取登录要用的token,memcard,Debug Sampler,CSV Data set  config参数化登录,循环控制器 ...