2013-08-15 12 views
5

के बीच दो तरह का संचार मेरे पास दो ऐप्स हैं। उनमें से एक दृश्य सी ++ में लिखा गया है और दूसरा एकता ऐप है, दोनों विंडोज़ पर चल रहे हैं। मेरे परिदृश्य में, मैं एकता फ़ंक्शन को कॉल करना चाहता हूं और जब भी उपयोगकर्ता मेरे सी ++ ऐप में बटन पर दबाता है तो ऑब्जेक्ट खींचना चाहता है। अब तक, मैंने mono_domain_assembly_open पर कॉल करके सी ++ ऐप के साथ एक ही पता स्थान में एकता निष्पादन योग्य को लोड करने का प्रयास किया है। हालांकि, यह हमेशा शून्य देता है और मैं एकता ऐप चलाने के लिए mono_jit_exec पर कॉल करने में सक्षम नहीं हूं। क्या मोनो का उपयोग करके उन दो अनुप्रयोगों के बीच दो तरह के संचार को बनाए रखना संभव है? अग्रिम धन्यवाद!अप्रबंधित कोड और unity3d कोड

उत्तर

3

this post के आधार पर मेरे पास एक पुराना उदाहरण है। आप जो चाहते हैं वह अपने सी # प्रतिनिधि को फ़ंक्शन पॉइंटर के रूप में 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; 
} 

सी # कॉलर:

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

मेरे उदाहरण में, सी ++ DLL तुरंत 1 से 42 सी # के कॉलबैक वेतन वृद्धि इस मूल्य का एक मूल्य के साथ सी # कॉलबैक कॉल करता है और इसे C++ पर लौटाता है जो बदले में CallbackExample कॉल साइट पर C# पर लौटाता है।

जब आप मुख्य थ्रेड के बाहर इंजन तक पहुंचने का प्रयास करते हैं तो एकता इसे पसंद नहीं करती है, इसलिए मुझे यकीन नहीं है कि क्या होता है यदि आपके सी ++ डीएलएल में एसिंक्रोनस कॉल सी # पर वापस आती है। मेरे उदाहरण में कॉल मुख्य एकता धागे में शुरू होती है इसलिए कोई समस्या नहीं है। मैं सुझाव दूंगा कि आप सी # कॉलबैक में किसी भी एकता विशिष्ट कार्यक्षमता की अनुमति न दें, इसके बजाय यूनिटी इंजन से जो कुछ भी आप चाहते हैं उसे लागू करने के लिए Update द्वारा उपयोग किए जाने के लिए बूलियन (या कुछ अन्य तंत्र) सेट करने के लिए कॉलबैक का उपयोग करें।

संबंधित मुद्दे