Unity使用的C++动态库回调C#函数

6 篇文章 0 订阅

Unity使用的C++动态库回调C#函数

引言

之前分享了一个文章:Unity显示C++动态库中的Log,其中使用到的主要能力就是,由C++动态库回调C#函数达到的。
这里我再对该功能进行专门的记录,并使用上面的这个文章做例子。

C++

首先,C++动态库中,先声明一个函数指针。

typedef void (*Log)(char* message, int iSize);

接着声明一下该指针类型的变量。

Log g_log;

如果需要将从C#传过来的函数地址全局保存,让其他的类都可以用这个回调函数,所以其他需要用到回调函数的ccp文件里,就需要再声明一次。

extern Log g_log;

然后就是导出一个接口,用来注册设置C#的函数地址。
头文件:

#ifndef DLL_API
#define DLL_API extern "C"
#endif

DLL_API void InitCSharpDelegate(void (*Log)(char* message, int iSize));

源文件:

DLL_API void InitCSharpDelegate(void (*Log)(char* message, int iSize))
{
	g_log = Log;
}

这样,源文件的任何位置,当需要回调C#的函数时,只要调g_log就可以了。

g_log(acLogStr, strlen(acLogStr));

C#

下面就是C#的代码,在C#中是由函数的委托来代替函数指针的。故代码如下。

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void LogDelegate(IntPtr message, int iSize);
[DllImport("mac", CallingConvention = CallingConvention.Cdecl)]
public static extern void InitCSharpDelegate(LogDelegate log);
[MonoPInvokeCallback(typeof(LogDelegate))]
public static void LogMessageFromCpp(IntPtr message, int iSize)
{
    Debug.Log(Marshal.PtrToStringAnsi(message, iSize));
}
public static void ShowLog()
{
    InitCSharpDelegate(LogMessageFromCpp);
}

现在,只需要在C#代码中调用ShowLog静态函数(设置注册回调)之后,C++动态库就能回调C#端的函数了。
完整的代码示例在文章Unity显示C++动态库中的Log中,但有些差别,可以一起对照查看。

参考链接

https://blog.csdn.net/u011414997/article/details/50574434

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Unity中,回调函数是一种常见的编程模式,用于在特定事件发生时执行特定的代码。回调函数通常用于处理异步操作、事件触发和消息传递等情况。 Unity中的回调函数可以通过以下几种方式来实现: 1. 事件委托和事件:Unity中的事件系统允许你定义和触发自定义事件,并将回调函数附加到这些事件上。你可以使用事件委托来定义事件的签名,然后使用事件关键字创建事件。当事件被触发时,附加的回调函数将被调用。 2. MonoBehaviour生命周期函数:MonoBehaviour是Unity中所有脚本的基类,它提供了一系列生命周期函数,如Start、Update、FixedUpdate等。你可以重写这些函数,并在特定的时间点执行你的代码。例如,在Start函数中初始化游戏对象,在Update函数中更新游戏逻辑。 3. 委托和Lambda表达式:Unity也支持使用委托和Lambda表达式来实现回调函数。你可以定义一个委托类型,并将其作为参数传递给其他方法。然后,你可以使用Lambda表达式来创建匿名方法,并将其作为回调函数传递给委托。 4. UnityEvent:Unity还提供了UnityEvent类,它是一种可序列化的事件类型。你可以在脚本中声明一个UnityEvent类型的公共字段,并在Inspector面板中将回调函数附加到该事件上。当事件被触发时,附加的回调函数将被调用。 总结一下,Unity使用回调函数的方式包括事件委托和事件、MonoBehaviour生命周期函数、委托和Lambda表达式以及UnityEvent。这些方法可以帮助你在特定的事件发生时执行特定的代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天富儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值