2013-08-15 11 views
5

Ich habe zwei Apps. Einer von ihnen ist in Visual C++ geschrieben und der andere ist eine Unity App, beide laufen auf Windows. In meinem Szenario möchte ich eine Einheitsfunktion aufrufen und ein Objekt zeichnen, wenn der Benutzer auf eine Schaltfläche in meiner C++ App drückt. Bisher habe ich versucht, die Einheit ausführbar in den gleichen Adressraum mit der C++ App zu laden, indem Sie mono_domain_assembly_open aufrufen. Es gibt jedoch immer Null zurück und ich kann mono_jit_exec nicht aufrufen, um die Unity-App auszuführen. Ist es möglich, die Zweiwegkommunikation zwischen diesen beiden Anwendungen mit Mono aufrechtzuerhalten? Vielen Dank im Voraus!Zwei-Wege-Kommunikation zwischen unmanaged Code und Unity3D-Code

Antwort

3

Hier ist ein altes Beispiel, basierend auf this post. Sie möchten Ihren C# -Delegaten als Funktionszeiger an C++ übergeben. Sie können diesen Funktionszeiger für die Verwendung durch Ihre Schaltfläche oder was auch immer Sie möchten, speichern.

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# Anrufer:

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; 
    } 
} 

In meinem Beispiel die C++ DLL ruft sofort den C# Rückruf mit einem Wert von 42 C# 's Callback-Schritten dieser Wert um 1 und gibt es an C++ zurück, das es wiederum an C# an der Aufrufseite zurückgibt.

Unity mag es nicht, wenn Sie versuchen, auf die Engine außerhalb des Hauptthreads zuzugreifen, daher bin ich mir nicht sicher, was passiert, wenn Ihre C++ DLL asynchrone Aufrufe an C# zurückgibt. In meinem Beispiel beginnen die Aufrufe im Haupteinheits-Thread, so dass es keine Probleme gibt. Ich würde vorschlagen, dass Sie keine Unity-spezifische Funktionalität im C# -Rückruf zulassen, stattdessen verwenden Sie den Rückruf, um einen booleschen (oder einen anderen Mechanismus) festzulegen, der von Update verwendet werden kann, um das von der Unity-Engine gewünschte zu implementieren.

Verwandte Themen