Ho due app. Uno di questi è scritto in visual C++ e l'altro è un'applicazione di unità, entrambi sono in esecuzione su Windows. Nel mio scenario, voglio chiamare una funzione di unità e disegnare un oggetto ogni volta che l'utente preme su un pulsante nella mia app C++. Finora, ho provato a caricare l'unità eseguibile nello stesso spazio indirizzo con l'app C++ chiamando mono_domain_assembly_open
. Tuttavia, restituisce sempre null e non sono in grado di chiamare mono_jit_exec
per eseguire l'app unity. È possibile mantenere una comunicazione bidirezionale tra queste due applicazioni usando mono? Grazie in anticipo!comunicazione a due vie tra codice non gestito e codice unity3d
risposta
Ecco un vecchio esempio che ho, basato su this post. Quello che vuoi è passare il tuo delegato C# a C++ come puntatore a funzione. Puoi memorizzare quel puntatore di funzione per usarlo dal tuo pulsante, o qualsiasi altra cosa desideri.
DLL C++:
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# Caller:
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;
}
}
Nel mio esempio, il ++ DLL C chiama immediatamente il C# richiamata con un valore di 42. incrementi di callback C# s 'questo valore di 1 e lo restituisce a C++ che a sua volta lo restituisce a C# nel sito di chiamata CallbackExample
.
Unity non piace quando si tenta di accedere al motore al di fuori del thread principale, quindi non sono sicuro di cosa succede se la DLL del C++ ha richiami asincroni a C#. Nel mio esempio le chiamate iniziano nel thread dell'unità principale quindi non ci sono problemi. Ti suggerirei di non consentire alcuna funzionalità specifica di Unity nel callback C#, invece di utilizzare il callback per impostare un booleano (o qualche altro meccanismo) da utilizzare da Update
per implementare qualsiasi cosa desideri dal motore Unity.