unity iOS C/Objective-C回调C#

本文介绍了两种在Unity中实现C#到C代码层的通信方法。方法一是通过UnitySendMessage调用GameObject上的特定方法;方法二是利用MonoPInvokeCallback和DllImport在C#和C之间注册回调函数,实现从C层到C#的函数调用。详细步骤包括C#和C代码的编写,以及如何传递和调用回调函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文 链接:https://www.jianshu.com/p/0c61444c9b28

  • 方法1
    UnitySendMessage("[gameobject_name]", "[method_name]", "[string_param]");
    这个方法要求场景中有个特定名称的GameObject对象,同时该对象上应该挂载某个MonoBehaviour脚本,在该脚本中包含有一个特定的方法(如下所示),当然如果该对象上挂载了多个脚本,并且这些脚本中都有该方法,那么这些方法都会被调用的!

public void method_name(string str) {
    //  some logici here
}
  • 方法二, 使用 MonoPInvokeCallback 从C#层向C层注册回调函数, 具体操作流程如下:
    C#层的代码如下

private delegate void OnViewClosed(int result, string msg);   // 

[MonoPInvokeCallback(OnViewClosed)]
static void CalledByNativeC(int result, string msg)
{
    // some logic here
}

// ... 

#if UNITY_IPHONE || UNITY_IOS
[DllImport("__Internal")]
private static extern void SetOnViewClosed(OnViewClosed event);
#endif

// ...
SetOnViewClosed(CalledByNativeC);    // 把C#中的回调函数传给C

MonoPInvokeCallbackAttribute.cs 的代码内容如下:

using System;

public sealed class MonoPInvokeCallbackAttribute : Attribute
{
    public MonoPInvokeCallbackAttribute(Type type)
    {
    }
}

C层的代码如下:

#include <stdlib.h>
#ifdef __cplusplus 
extern "C" { 
#endif

typedef void (*OnViewClosed)(int result, const char* msg);  // 定义函数指针

static OnViewClosed s_calledFromCSharp = NULL;

// 接受C#层传过来的函数指针
void SetOnViewClosed(OnViewClosed viewClosed)    
{
    s_calledFromCSharp = viewClosed;
}
 
// ......
// 某处C/Objecive-C触发该回调函数的代码如下 
   if (s_calledFromCSharp != NULL)
       s_calledFromCSharp(result, msg);
//......

#ifdef __cplusplus 
} 
#endif  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值