2013-08-15 4 views
5

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

3

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.