有两种方法

UnitySendMessage方式(接口声明固定,只能是 void method(string message);不能带有返回值;必须要挂载到对象后才能调用。

使用方法很简单

NSString *resultStr = @"hello world";
UnitySendMessage("Main Camera", "callback", resultStr.UTF8String);

使用函数指针接口方法进行回调,可以传参,也可以带返回参数,调用灵活

C#文件代码

void Start()
    #if UNITY_IOS
    //设置回调托管函数指针
    eckShowPlayer handler = new eckShowPlayer(eckShowPlayerHandler);
    IntPtr showPlayer = Marshal.GetFunctionPointerForDelegate(handler);
    //调用OC的方法,将C#的回调方法函数指针传给OC
    eckRegisterRecieveGameCallback(showPlayer);
    #endif
#if UNITY_IOS
        //声明一个OC的注册回调方法函数指针的函数方法,每一个参数都是函数指针
    [DllImport("__Internal")]
    public static extern void eckRegisterRecieveGameCallback(
        IntPtr showPlayer
        //先声明方法、delegate修饰标记是回调方法
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void eckShowPlayer(string userId);
        //实现回调方法 MonoPInvokeCallback修饰会让OC通过函数指针回调此方法
    [AOT.MonoPInvokeCallback(typeof(eckShowPlayer))]
    static void eckShowPlayerHandler(string userId) 
        Debug.Log("收到来自oc的参数  - "+userId );
#endif 
// testUnity.h
//定义一个名字参数和C#类一样的方法
typedef void (*eckShowPlayerHandler) (const char *userId);
extern "C"{
     设置回调游戏的托管函数
    void eckRegisterRecieveGameCallback(eckShowPlayerHandler showPlayer);
// testUnity.m
//生命一个静态变量存储回调unity的函数指针
static eckShowPlayerHandler showPlayerBlock;
extern "C"{
     设置回调游戏的托管函数
    void eckRegisterRecieveGameCallback(eckShowPlayerHandler showPlayer)
        showPlayerBlock = showPlayer;

这样在OC想要回调游戏的是时候即可调用 showPlayerBlock 就行了。

其实大概流程就是先将C#的函数指针存入OC内存,在OC需要回调unity的时候就可以使用不同的指针来回调不同的unity方法,我上面的例子是一个方法、同理可以传入多个方法指针,每个方法也可以添加返回值等。大家有不懂的可以留言和我交流哈。