解决Unreal3 Can't bind to native class "xxx"异常退出的问题

转载自:http://hi.baidu.com/dbfr2011818/item/b1a19a0fbe968cc12f4c6b08

这通常发生在我们添加了新的native类,而且在当前包里生成了新的C++头文件的时候,比如说我们添加一个新的ExampleGameEngine的Native类。这样会重新生成一个ExampleGameGameEngineClasses.h头文件。

这时候如果我们直接编译的话不会出错,编译脚本也没问题,但是运行时会出现错误,提示:

.\Src\UnClass.cpp(2030): Assertion failed: appErrorf
Can't bind to native class ExampleGame.ExampleGameEngine
DEBUG-ExampleGame.exe 已触发了一个断点

这是因为我们在生成了新的C++头文件的时候忘了注册它,在该头文件中我们可以看到类似这样的代码:

DECLARE_NATIVE_TYPE(ExampleGame,UExampleGameEngine);

#define AUTO_INITIALIZE_REGISTRANTS_EXAMPLEGAME_GAMEENGINE \
UExampleGameEngine::StaticClass(); \

#endif // EXAMPLEGAME_GAMEENGINE_NATIVE_DEFS

我们需要把这个宏添加到恰当的位置去注册它。添加到哪里呢?

全文搜索AUTO_INITIALIZE_REGISTRANTS_就可以找到类似的代码了,对于ExampleGame来说,就是在ExampleGame.cpp里面,UTGame在UTGame.cpp下面。

将函数修改为类似这样:

void AutoInitializeRegistrantsExampleGame( INT& Lookup )
{
AUTO_INITIALIZE_REGISTRANTS_EXAMPLEGAME;
AUTO_INITIALIZE_REGISTRANTS_EXAMPLEGAME_TEXTURE;
AUTO_INITIALIZE_REGISTRANTS_EXAMPLEGAME_GAMEENGINE;
}

另外这个宏有意义还取决于一个宏定义的值:STATIC_LINKING_MOJO

因此我们在ExampleGame.cpp中包含新生成的头文件的时候需要注意它的位置,必须在STATIC_LINKING_MOJO存在且值为1的代码块中。另外由于各个版本的U3都有不同程度的变化,在添加头文件的时候还是需要注意的,这个可以参考已经存在的分类头文件,依样画葫芦就好了。

再次编译,问题搞定。

posted @ 2012-10-26 16:05  hillin  阅读(2424)  评论(0编辑  收藏  举报