unity 中 c# 与 object-c 交互

时间:2021-12-24 04:11:39

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#参数类型映射关系,可以看这里 http://blog.csdn.net/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:nstitle

                                                       message:nsmsg

                                                      delegate:nil

                                             cancelButtonTitle:NSLocalizedString(@"Close", nil)

                                             otherButtonTitles:nil];

        

        [view show];

    }

}
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
public class testscript : MonoBehaviour {

    // Use this for initialization
    void Start () {
    
    }
    
    // Update is called once per frame
    void 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,还没测试过。