可以用C++语言为Unity编写插件,C++插件提供给Unity C#脚本调用的函数必须声明在C中:
extern "C" {
float FooPluginFunction ();
}
这是为了避免Name Mangling机制带来的影响。
Unity C#脚本调用插件函数:
[DllImport("PluginName")]
private static externfloat FooPluginFunction ();
Unity 插件编写文档http://docs.unity3d.com/Documentation/Manual/Plugins.html。
Unity是基于Mono开源项目编写的。与微软的.NET Framework不同,Mono项目是跨平台的。Mono应用程序代码都是托管的,Mono应用程序可以通过使用System.Runtime. InterOpServices库创建C#绑定来调用已存的非托管代码。UnityC#脚本调用C++插件也是从托管代码调用非托管代码的过程。
http://www.mono-project.com/Interop_with_Native_Libraries。
从Unity插件调用Unity C#脚本函数,可以用mono运行时库实现:
http://www.mono-project.com/Embedding_Mono#Invoking_Methods_in_the_CIL_universe。
Mac OS平台实现参考:
http://www.reigndesign.com/blog/unity-native-plugins-os-x。
从C代码调用托管C#代码另一个比较简洁的方式是,把C#委托传入C代码并赋值给C函数指针,通过调用C函数指针来实现对C#委托的调用。这个方法需要Mono System. Runtime.InterOpServices支持。
C#代码:
usingSystem.Runtime.InteropServices;
class Demo {
delegate int MyCallback1 (int a, int b);
[DllImport ("MyRuntime")]
extern static void RegisterCallback(MyCallback1 callback1);
static int Add (int a, int b) { return a +b; }
void Init ()
{
//C# Add函数注册给C代码
RegisterCallback (Add);
}
}
C代码:
typedef int(*callback-t) (int a, int b);
static callback_tmy_callback;
void RegisterCallback(my_callback_t cb)
{
my_callback = cb;
}
//实现对托管C#代码调用
int InvokeManagedCode(int a, int b)
{
if (my_callback == NULL){
abort();
}
return (*my_callback) (a, b);
}