解决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都有不同程度的变化,在添加头文件的时候还是需要注意的,这个可以参考已经存在的分类头文件,依样画葫芦就好了。
再次编译,问题搞定。