6

我有两个应用程序。其中一个是用 Visual c++ 编写的,另一个是一个统一的应用程序,两者都在 Windows 上运行。在我的场景中,每当用户按下我的 c++ 应用程序中的按钮时,我想调用一个统一函数并绘制一个对象。到目前为止,我已经尝试通过调用mono_domain_assembly_open. 但是,它总是返回 null,我无法调用mono_jit_exec以运行统一应用程序。这是否可以使用单声道在这两个应用程序之间保持双向通信?提前致谢!

4

1 回答 1

5

这是我的一个老例子,基于这篇文章。您想要的是将您的 C# 委托作为函数指针传递给 C++。您可以存储该函数指针以供您的按钮使用,或者您想要的任何其他内容。

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#调用者:

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

在我的示例中,C++ DLL 立即调用值为 42 的 C# 回调。C# 的回调将该值递增 1 并将其返回给 C++,而 C++ 又将其返回给CallbackExample调用站点的 C#。

当您尝试在主线程之外访问引擎时,Unity 不喜欢它,所以我不确定如果您的 C++ DLL 异步调用回 C# 会发生什么。在我的示例中,调用从主统一线程开始,因此没有问题。我建议您不要在 C# 回调中允许任何 Unity 特定功能,而是使用回调来设置一个布尔值(或其他一些机制),以用于Update从 Unity 引擎实现您想要的任何内容。

于 2013-08-17T02:53:21.447 回答