2012-05-09 7 views
6

스크립트에서 새 스레드를 만들 수 있다면 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(); 


    } 
} 
+1

발생한 충돌이 C#의 문자열을 마샬링하지 않아서 C# (Unity)로 다시 전달하기 전에 발생했는지 (예 : 'mono_string_new()'사용 - http : // www. mono-project.com/Embedding_Mono#Creating_objects)? – hatboyzero

답변

4

대답은 입니다!

Unity 3.5.2f2, Pro 라이센스로 2012 년 8 월 8 일에 다시 테스트되었습니다. @ 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을 포함하지 않았다. 위의 두 부분만으로도 제 문제가 해결되었습니다.

-5

야 단결이 엉망

다음은 유니티 충돌 내 코드입니다. 그것은 언제든지 충돌 할 수 있습니다. 단지 gnome을 사용하십시오.

+0

그게 아니라 Unity ... Unity3D 게임 엔진 –

관련 문제