非托管代码和unity3d代码之间的双向通信

时间:2013-08-15 21:20:31

标签: c++ mono unity3d

我有两个应用程序。其中一个是用visual c ++编写的,另一个是统一应用程序,都在windows上运行。在我的场景中,我想调用一个单位函数,并在用户按下我的c ++应用程序中的按钮时绘制一个对象。到目前为止,我已经尝试通过调用mono_domain_assembly_open将cx应用程序中的unity可执行文件加载到相同的地址空间中。但是,它总是返回null,我无法调用mono_jit_exec来运行unity app。这可能是使用mono维护这两个应用程序之间的双向通信吗? 提前谢谢!

1 个答案:

答案 0 :(得分:4)

这是我的一个老例子,基于this post。你想要的是将C#委托作为函数指针传递给C ++。您可以存储该功能指针供您的按钮使用,或者您想要的任何其他内容。

C ++ DLL:

typedef int ( __stdcall *UnityCallback )( int );

static UnityCallback gCallBack;
extern "C" __declspec( dllexport )
inline int CallbackExample( UnityCallback unityFunctionPointer, int n )
{
    gCallBack = unityFunctionPointer;
    if( gCallBack )
    {
        return gCallBack( n );
    }
    return 0;
}

C#来电者:

using UnityEngine;
using System;
using System.Runtime.InteropServices;

public class Callback : MonoBehaviour {
    public delegate int CallbackDelegate( int n );

    [DllImport ("UnityPluginCallback")]
    private static extern int CallbackExample(CallbackDelegate fp, int n);

    void Awake()
    {
        int result = CallbackExample(new CallbackDelegate(this.CallbackTest), 42);
        Debug.Log("Result from callback, should be 43: " + result);
    }


    int CallbackTest( int n )
    {
        Debug.Log("Received: " + n + " from C++ dll");
        return n+1;
    }
}

在我的示例中,C ++ DLL立即调用值为42的C#回调.C#的回调将此值递增1并将其返回给C ++,C ++又将其返回到CallbackExample调用站点的C#。

当你尝试访问主线程之外的引擎时,Unity不喜欢它,所以我不确定如果你的C ++ DLL有异步回调到C#会发生什么。在我的例子中,调用在主统一线程中开始,因此没有问题。我建议你不要在C#回调中允许任何Unity特定的功能,而是使用回调设置一个布尔(或其他一些机制)供Update用来实现你想要的Unity引擎