Unity中给C++库传递委托
//.h
//把委托转成stdcall的函数指针
typedef void(__stdcall* KeyDownDelegate)(int keyNum);
extern "C" __declspec(dllexport) void SetKeyDownCallback(KeyDownDelegate keyDownCallback);
//.cpp
//声明全局委托
KeyDownDelegate g_keyDownCallback;
//函数实现
void SetKeyDownCallback(KeyDownDelegate keyDownCallback)
{
g_keyDownCallback = keyDownCallback;
}
//调用 keyNum是int参数
g_keyDownCallback(keyNum)
由于C++和C#使用不同的调用约定,因此我们在定义c++中的类型时需要指定调用约定,C#中的默认调用约定stdcall。
//Plugin.cs
public delegate void KeyDownDelegate(int arg);
[DllImport("handle_clientkey_dll")]
public static extern void SetKeyDownCallback(KeyDownDelegate keyDownCallback);
//Test.cs
Plugin.KeyDownDelegate keyDownDelegate = new Plugin.KeyDownDelegate(KeyDownFunc);
public static void KeyDownFunc(int i)
{
Debug.LogWarning($"第{i}号按键按下");
}
Plugin.SetKeyDownCallback(keyDownDelegate);
在C#绑定委托时,最好使用静态的,我在使用非静态函数的时候,会导致unity闪退。

浙公网安备 33010602011771号