क्रैश करने के लिए यूनिटी का कारण बनता है क्या सीआई/सी ++ फ़ंक्शन कॉलबैक को यूनिटी स्क्रिप्ट में बनाना संभव है, बशर्ते आप स्क्रिप्ट से नया थ्रेड बना सकें? मैंने कोशिश की लेकिन जैसे ही स्क्रिप्ट निष्पादित हो जाती हैं, एकता क्रैश हो जाती है।इंटरऑप
मैं इसके बारे में 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();
}
}
आप माना जाए या नहीं दुर्घटना आप अनुभव कर रहे C++ में स्ट्रिंग प्रमुखता नहीं की वजह से है इसे पारित वापस सी # (एकता) तक से पहले (यानी उपयोग करते हुए 'mono_string_new()' है। mono-project.com/Embedding_Mono#Creating_objects)? – hatboyzero