我想在Unity中集成一个C++项目。Unity提供了一种称为I2CPP(C++中间语言(的机制,它允许将C++代码添加到您的Unity项目中。我在Visual Studio中的"Blank App(Universal Windows C++/CX("项目中创建了一个简单的C++类和头。
// header
namespace SomeNamespace {
public ref class MyRuntimeClass sealed
{
public:
// Constructor
MyRuntimeClass();
// Method to check if initialized
bool IsClassInitialized();
private:
bool _isRuntimeInitialized = false;
};
}
和
// implementation
using SomeNamespace;
MyRuntimeClass::MyRuntimeClass()
{
_isRuntimeInitialized = true;
}
bool MyRuntimeClass::IsClassInitialized()
{
return _isRuntimeInitialized;
};
我在Unity中做了一个简单的项目,并对文档中概述的播放器设置进行了必要的更改。我还添加了一个立方体作为游戏对象,并在立方体上附加了一个使用我的C++代码的脚本,即
#if ENABLE_WINMD_SUPPORT
using SomeNamespace;
#endif
public class RuntimeSampleUnity : MonoBehaviour
{
#if ENABLE_WINMD_SUPPORT
private MyRuntimeClass _myRuntimeClass;
#endif
// Default MonoBehaviour method
void Start()
{
#if ENABLE_WINMD_SUPPORT
// New instance of runtime class
_myRuntimeClass = new MyRuntimeClass();
// Check to see if we initialized C++ runtime component
var isInit = _myRuntimeClass.IsClassInitialized();
Debug.LogFormat("MyRuntimeClass: {0}", isInit);
#endif
}
}
在最后一步中,我将C++项目中的winmd文件添加到了Unity中的资产中。该项目构建良好,但当我运行该项目时,我会得到一个Platform.WrongThreadException: The application called an interface that was marshalled for a different thread
。是什么导致了此异常(以及如何修复它(?
编辑:为了详细说明我为什么要做我正在做的事情:微软提供了一个项目,展示了如何将OpenCV(C++(集成到基于HoloLens的项目中。虽然它提供了一个混合了OpenCV和C#的UWP项目,但它没有展示如何将这个特定的项目集成到Unity中。实际上有人通过I2CPP实现了这一点。虽然我在使用他基于Visual Studio 2017的项目进入Visual Studio 2019时遇到了问题,但我试图做一个简单的例子来了解它(基本上(是如何工作的。
我认为您误解了IL2CPP的概念。
IL2CPP(C++的中间语言(是Unity开发的脚本后端,您可以在构建时将其用作Mono的替代方案各种平台的项目。当使用IL2CPP构建项目时,Unity将IL代码从脚本和程序集转换为C++,之前为您的选择的平台。IL2CPP的一些用途包括增加Unity的性能、安全性和平台兼容性项目。
要使用C++,您必须编写一个本机插件。