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