Unity C++插件

来源:互联网 发布:淘宝数据提取6.0 编辑:程序博客网 时间:2024/05/20 06:29

可以用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);

}

原创粉丝点击