2013-08-15 49 views
5

Tôi có hai ứng dụng. Một trong số chúng được viết bằng hình ảnh C++ và một là một ứng dụng thống nhất, cả hai đều đang chạy trên các cửa sổ. Trong kịch bản của tôi, tôi muốn gọi một hàm thống nhất và vẽ một đối tượng bất cứ khi nào người dùng nhấn vào một nút trong ứng dụng C++ của tôi. Cho đến nay, tôi đã cố gắng tải unity thực thi vào cùng một không gian địa chỉ với ứng dụng C++ bằng cách gọi mono_domain_assembly_open. Tuy nhiên, nó luôn trả về null và tôi không thể gọi mono_jit_exec để chạy ứng dụng thống nhất. Điều này có thể duy trì liên lạc hai chiều giữa hai ứng dụng đó bằng mono không? Cảm ơn bạn trước!liên lạc hai chiều giữa mã không được quản lý và mã unity3d

Trả lời

3

Đây là ví dụ cũ tôi có, dựa trên số this post. Những gì bạn muốn là truyền C# delegate của bạn tới C++ như một con trỏ hàm. Bạn có thể lưu trữ con trỏ hàm đó để sử dụng bằng nút của bạn hoặc bất kỳ thứ gì bạn muốn.

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

C# Caller:

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

Trong ví dụ của tôi, C++ DLL ngay lập tức gọi C# gọi lại với giá trị là 42. increments callback C# 's giá trị này bằng 1 và trả về C++ và trả về C# tại trang gọi CallbackExample.

Unity không thích nó khi bạn cố gắng truy cập vào động cơ bên ngoài của chủ đề chính vì vậy tôi không chắc chắn những gì sẽ xảy ra nếu DLL C++ của bạn có cuộc gọi không đồng bộ trở lại C#. Trong ví dụ của tôi, các cuộc gọi bắt đầu trong chuỗi chính thống nhất nên không có vấn đề gì. Tôi sẽ đề nghị bạn không cho phép bất kỳ chức năng cụ thể nào của Unity trong cuộc gọi lại C#, thay vào đó hãy sử dụng gọi lại để đặt boolean (hoặc một số cơ chế khác) được sử dụng bởi Update để thực hiện bất cứ điều gì bạn muốn từ công cụ Unity.