2013-08-15 8 views
5

私は2つのアプリを持っています。そのうちの1つはVisual C++で書かれていて、もう1つは統一アプリであり、どちらもウィンドウ上で実行されています。私のシナリオでは、私はユニティ関数を呼び出し、ユーザが私のC++アプリケーションのボタンを押すたびにオブジェクトを描画したいと思っています。これまでは、mono_domain_assembly_openを呼び出して、C++アプリケーションで同じアドレス空間に実行可能ファイルをロードしようとしました。ただし、常にnullが返され、mono_jit_execにユニティアプリケーションを実行することができません。モノを使用してこれらの2つのアプリケーション間の双方向通信を維持することは可能ですか? ありがとうございます!アンマネージコードとunity3dコードの間の双方向通信

答えて

3

私が持っている古い例は、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は、直ちに1で、この値は42 C#のコールバック刻みの値を持つC#のコールバックを呼び出し、それをC++に返します.C++はそれをC#のCallbackExampleコールサイトに返します。

メインスレッド外のエンジンにアクセスしようとすると、Unityがそれを気に入らないので、C++ DLLがC#に非同期呼び出しを戻した場合にどうなるかはわかりません。私の例では、呼び出しはメインのスレッドで開始されるので、問題はありません。 C#コールバックでUnity固有の機能を許可しないで、代わりにコールバックを使用してUpdateによって使用されるブール値(またはその他のメカニズム)をUnityエンジンから実装することをお勧めします。