200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > unity 中 c# 与 object-c 交互

unity 中 c# 与 object-c 交互

时间:2020-08-30 07:14:40

相关推荐

unity 中 c# 与 object-c 交互

C/C++可以直接与object-c交互,只需把文件后缀写成.mm就行了。c#又可以和C/C++交互,所以嘛。。。c#也就可以和object-c交互了。

1、在unity中 c#调用object-c 函数

首先,定义一个新建一个.mm文件,然后在里面定义一个C风格接口的函数,如

extern "C"

{

void testFunc(char* arg)

{

// 这里可以调用object-c的函数了

// 如 [[ AlertView alloc] init]; ...

}

}

第二步,将这个mm文件放到unity工程的Assets/Plugins/IOS路径下。

第三步,声明C函数。c#脚本,调用上面的C接口,C函数里面又调用object-c的函数,最终就能达到c#调用object-c的目的。但是,如何C#中并没有testFunc这个函数,所以要先做函数声明。

unity若要编译ios项目,首先要导出xcode工程,然后再由xcode导出ipa安装包。当你生产xcode工程时,你会发现,第二步中的mm文件被引用到了xcdoe工程的Libraries下(你可以在xcdoe中的Libraries下找找看)。我的理解是这个mm文件最终会被编译成库,那上面的testFunc函数就成了库函数。在c#中要使用这个库函数,首先要在文件头加入using System.Runtime.InteropServices;然后声明函数:

[DllImort("__Internal")]

private static extern void testFunc(string arg);

注意:这里的参数类型!!!是string而不是char*。关于C与C#参数类型映射关系,可以看这里/yatusiter/article/details/9221861

第四步,调用函数。这时函数也在c#中声明过了,使用时就可以直接调用了。

代码如下:

extern "C"{void test(char* title, char* msg, char* url){NSString* nstitle = [[NSString alloc] initWithUTF8String:title];NSString* nsmsg = [[NSString alloc] initWithUTF8String:msg];NSString* nsurl = [[NSString alloc] initWithUTF8String:url];UIAlertView* view = [[UIAlertView alloc] initWithTitle:nstitlemessage:nsmsgdelegate:nilcancelButtonTitle:NSLocalizedString(@"Close", nil)otherButtonTitles:nil];[view show];}}

using UnityEngine;using System.Collections;using System.Runtime.InteropServices;public class testscript : MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}[DllImport("__Internal")]private static extern void test (string title, string msg, string url);void OnGUI(){if (GUI.Button (new Rect (100, 100, 100, 50), "test obj-c func")) {test ("omytitle", "omymsg", "omyurl"); }}}

2、unity中 object-c 调用c#

UnitySendMessage("GameObjectName1", "MethodName1", "Message to send");

参数1:gameobject名字;参数2:回调函数的名字;参数3:参数。同android开发中java回调c#一样,三个参数都是字符串类型!但android开发中的第三个参数不能是null(若没有参数,可以用空字符串"",因为使用null程序会崩掉),这里不知道能不能为null,还没测试过。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。