转载自:
这通常发生在我们添加了新的native类,而且在当前包里生成了新的C++头文件的时候,比如说我们添加一个新的ExampleGameEngine的Native类。这样会重新生成一个ExampleGameGameEngineClasses.h头文件。
这时候如果我们直接编译的话不会出错,编译脚本也没问题,但是运行时会出现错误,提示:
.\Src\UnClass.cpp(2030): Assertion failed: appErrorf
Can't bind to native class ExampleGame.ExampleGameEngineDEBUG-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都有不同程度的变化,在添加头文件的时候还是需要注意的,这个可以参考已经存在的分类头文件,依样画葫芦就好了。
再次编译,问题搞定。