2012-05-09 16 views
6

क्रैश करने के लिए यूनिटी का कारण बनता है क्या सीआई/सी ++ फ़ंक्शन कॉलबैक को यूनिटी स्क्रिप्ट में बनाना संभव है, बशर्ते आप स्क्रिप्ट से नया थ्रेड बना सकें? मैंने कोशिश की लेकिन जैसे ही स्क्रिप्ट निष्पादित हो जाती हैं, एकता क्रैश हो जाती है।इंटरऑप

मैं इसके बारे में googled और this thread जो कहते हैं

एकता कालबैक नहीं है और न ही threadsafe पाया, वर्गों के लिए किसी भी उपयोग कि UnityEngine.Object विस्तार केवल एकता स्क्रिप्ट के रूप में ही धागा के भीतर से अनुमति दी है चल रहे हैं दो में अन्य धागे से और न ही कॉम/ओएस async संचालन से asyncrnous कॉलबैक से asyncronous नहीं,

नहीं हैं, तो आप के लिए thats मामले संभव तरीके:

(1) एक आवरण है कि इन कॉलबैक हो जाता है और सामान कतारों और फिर एक समारोह है कि एकता एक अवरुद्ध में अगली घटना/ dataobject या जो कुछ भी अनुरोध करने के लिए अनुमति देता है बेनकाब लिखें, unthreaded प्रपत्र (2) कॉलबैक एक में कॉल करते हैं कुछ System.Object से विस्तार पर स्थिर समारोह और UnityEngine.Object

विस्तार वर्गों पर जानकारी का अनुरोध करने के रूप में ऊपर तर्क का एक ही प्रकार के बारे में लेकिन मुझे लगता है कि अगर मैं एक धागा बनाने और उसे उस थ्रेड में कालबैक , ठीक है ठीक है? मैं इस तरह सोच रहा हूं क्योंकि मैंने this one जैसे धागे पढ़े हैं जो सी कार्यों को सी # कार्यों को वापस कॉल करने के तरीके को प्रस्तुत करते हैं। इसलिए मैंने तर्क दिया कि यदि मैं एक नया धागा बना देता हूं, तो यह अब एकता नहीं है, यह सिर्फ मोनो और सी # होगा।

सी ++ कोड:

#include <iostream> 
// #include "stdafx.h" 

typedef int (__stdcall * Callback)(const char* text); 

Callback Handler = 0; 

extern "C" __declspec(dllexport) 
void __stdcall SetCallback(Callback handler) { 
    Handler = handler; 
} 

extern "C" __declspec(dllexport) 
void __stdcall TestCallback() { 
    int retval = Handler("hello world"); 
} 

सी # कोड:

using UnityEngine; 
using System; 
using System.Runtime.CompilerServices; 
using System.Runtime.InteropServices; 
using System.Threading; 


class UnManagedInterop : MonoBehaviour { 
    private delegate int Callback(string text); 
    private Callback mInstance; // Ensure it doesn't get garbage collected 


    public void Test() { 
     mInstance = new Callback(Handler); 
     SetCallback(mInstance); 
     TestCallback(); 
    } 

    private int Handler(string text) { 
    // Do something... 
    print(text); 
    return 42; 
    } 

    [DllImport("test0")] 
    private static extern void SetCallback(Callback fn); 
    [DllImport("test0")] 
    private static extern void TestCallback(); 

    void Start() 
    { 
     Thread oThread = new Thread(new ThreadStart(Test)); 

     // Start the thread 
     oThread.Start(); 


    } 
} 
+1

आप माना जाए या नहीं दुर्घटना आप अनुभव कर रहे C++ में स्ट्रिंग प्रमुखता नहीं की वजह से है इसे पारित वापस सी # (एकता) तक से पहले (यानी उपयोग करते हुए 'mono_string_new()' है। mono-project.com/Embedding_Mono#Creating_objects)? – hatboyzero

उत्तर

4

उत्तर हाँ है!

मैंने 8 अगस्त 2012 को यूनिटी 3.5.2 एफ 2, प्रो लाइसेंस के साथ फिर से परीक्षण किया। @ Hatboyzero की टिप्पणी के लिए धन्यवाद मुझे this example मिला।

हालांकि मेरे सवाल में कोड काम नहीं करता है, तो निम्न कोड काम करता है:

// C# 
using System.Runtime.InteropServices; 

class Demo { 
    delegate int MyCallback1 (int a, int b); 

    [DllImport ("MyRuntime")] 
    extern static void RegisterCallback (MyCallback1 callback1); 

    static int Add (int a, int b) { return a + b; } 
    static int Sub (int a, int b) { return a - b; } 

    void Init() 
    { 
     // This one registers the method "Add" to be invoked back by C code 
     RegisterCallback (Add); 
    } 
} 


// C 
typedef int (*callback_t) (int a, int b); 
static callback_t my_callback; 

void RegisterCallback (callback_t cb) 
{ 
    my_callback = cb; 
} 

int InvokeManagedCode (int a, int b) 
{ 
    if (my_callback == NULL){ 
     printf ("Managed code has not initialized this library yet"); 
     abort(); 
    } 
    return (*my_callback) (a, b); 
} 

मैं एम्बेड करने के लिए MonoRuntime के रूप में ट्यूटोरियल का सुझाव नहीं था। कोड के उपरोक्त दो टुकड़े मेरी समस्या हल कर चुके हैं। // www: http देखते हैं -

-5

Dude एकता में गड़बड़ है

यहाँ मेरी कोड है कि एकता दुर्घटनाओं है। यह किसी भी समय क्रैश हो सकता है, बस gnome का उपयोग करें।

+0

नहीं एकता .... यूनिटी 3 डी गेम इंजन –

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