Unity C++插件

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

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值