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 ...
随机推荐
- CSS3 中弹性盒模型--容器的属性
1.display : flex | inline-flex注意,设为 Flex 布局以后,子元素的float.clear和vertical-align属性 将失效. 2.flex-direction ...
- elasticsearch5.3.0 bulk index 性能调优实践
elasticsearch5.3.0 bulk index 性能调优实践 通俗易懂
- "etc/profile" E212: Can't open file for writing
今天安装Java环境,出现如下错误: "etc/profile" E212: Can't open file for writing 这是安装到本地JDK路径不正确导致.怎么办呢? ...
- sleep()和wait()的区别
1 sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. 2 Thread.sleep和Object.wait都会暂停当前的线程,对于CP ...
- 关于jquery的clone()和javascript的cloneNode()
区别: jquery的clone( ),如果是true就是深克隆,把事件都会克隆过去:如果是false,则仅仅克隆的是结构: javascript的cloneNode( ),如果是true,会将子节点 ...
- YOLO训练Pedestrain
Pedestrain dl 使用darknet训练: 1. Inria 创建 yolo-inria.cfg 从cfg/yolo-voc.2.0.cfg拷贝一份,修改batch=64, subdivi ...
- 扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。
练习目标-使用引用类型的成员变量:在本练习中,将扩展银行项目,添加一个(客户类)Customer类.Customer类将包含一个Account对象. 任务 在banking包下的创建Customer类 ...
- DOM高级编程
前言:W3C规定的三类DOM标准接口(换图)Core DOM(核心DOM),适用于各种结构化文档:XML DOM(Java OOP学过),专用于XML文档:HTML DOM,专用于HTML文档,下面了 ...
- tp实现多语言支持测试
用tp框架实现网页多种语言切换 时间:2016-11-11 浏览次数:1120 编辑:youjiejie 网页如何设计多种语言切换,本文用tp框架实现网页多种语言切换方法结合实例形式较为详细的分析 ...
- 【sqli-labs】 less37 POST- Bypass MYSQL_real_escape_string (POST型绕过MYSQL_real_escape_string的注入)
POST版本的less36 uname=1&passwd=1%df' or 1#