oka*_*nte 5 c++ mono unity-game-engine
我有两个应用程序.其中一个是用visual c ++编写的,另一个是统一应用程序,都在windows上运行.在我的场景中,我想调用一个单位函数,并在用户按下我的c ++应用程序中的按钮时绘制一个对象.到目前为止,我已尝试通过调用将cx应用程序加载到同一地址空间中mono_domain_assembly_open
.但是,它总是返回null,我无法调用mono_jit_exec
运行Unity app.这可能是使用mono维护这两个应用程序之间的双向通信吗?提前致谢!
这是我的一个旧示例,基于这篇文章。您想要的是将 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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
在我的示例中,C++ DLL 立即调用值为 42 的 C# 回调。C# 的回调将此值增加 1 并将其返回给 C++,C++ 又将其返回给CallbackExample
调用站点的C# 。
当您尝试在主线程之外访问引擎时,Unity 不喜欢它,所以我不确定如果您的 C++ DLL 异步调用回 C# 会发生什么。在我的示例中,调用在主统一线程中开始,因此没有问题。我建议您不要在 C# 回调中允许任何特定于 Unity 的功能,而是使用回调来设置一个布尔值(或其他一些机制),用于Update
从 Unity 引擎实现您想要的任何内容。