스크립트에서 새 스레드를 만들 수 있다면 C/C++ 함수 콜백을 Unity 스크립트로 만들 수 있습니까? 시도했지만 스크립트가 실행되면 Unity가 충돌합니다. Interop로 인해 Unity가 충돌합니다.
내가 그것에 대해 인터넷 검색 및유니티 콜백되지 말한다 this thread도 스레드를 발견, UnityEngine.Object을 확장 클래스에 대한 액세스은 유니티 스크립트와 동일한 스레드 내에서 허용 실행 다른 스레드 에서 나 COM/OS 비동기 작업에서 asyncrnous 콜백에서 asyncronous하지에
당신을위한 경우 먹으 렴가있는 경우 두 가지 방법 :(1) 이러한 콜백을 가져오고 대기열에 넣는 래퍼를 작성하고 이 다음 이벤트/ 데이터 객체 또는 블로킹되지 않은 스레드 된 양식의 항목을 요청할 수있는 기능을 노출합니다. (2) 콜백 호출을 으로 System.Object에서 연장 뭔가 정적 기능과 UnityEngine.Object
을 확장 클래스에 정보를 요청하기 위해 위의 논리 같은 종류의 쓰기하지만 내가 스레드를 만드는 경우 생각하고 스레드로 콜백 괜찮을거야?this one과 같은 스레드를 읽었으므로 C# 함수를 다시 호출하는 C 함수를 만드는 방법을 소개하므로이 방법을 생각합니다. 그래서 새로운 스레드를 만들면 더 이상 Unity가 아니라 모노와 C#이 될 것이라고 추론했습니다.
는 C++ 코드 :
#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");
}
C# 코드 :
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#의 문자열을 마샬링하지 않아서 C# (Unity)로 다시 전달하기 전에 발생했는지 (예 : 'mono_string_new()'사용 - http : // www. mono-project.com/Embedding_Mono#Creating_objects)? – hatboyzero