今天遇到了一个诡异的问题,经过几个小时的煎熬终于找到了原因。mmmp
如果有一个类AActorChild,这个AActorChild继承自AActor,再有一个蓝图类BPAActorChild。
蓝图类BPAActorChild:
C++类AActorChild的BeginPlay函数:
void AActorChild::BeginPlay() { Super::BeginPlay(); GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, TEXT("C++ BeginPlay")); }
按照一般的思维肯定会认为运行后的结果是:1, C++ BeginPlay ,2,BPBeginPlay。这么想的原因就是我的C++类继承Actor,然后蓝图类又继承自这个C++类,这样C++的BeginPlay调了父类的BeginPlay,蓝图又通过某种方式调C++类的。
但是事实是相反的。运行出来的结果是:1,BPBeginPlay 2,C++ BeginPlay。
然后继续做另一个测试,把C++类的BeginPlay改为如下:
void AActorChild::BeginPlay() { GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, TEXT("C++ BeginPlay")); Super::BeginPlay(); }
这样运行的结果就是:1,C++ BeginPlay 2,BPBeginPlay。
这样看起来是蓝图的BeginPlay那一坨是跟着Super::BeginPlay()执行的。
经过一番探索发现蓝图中的BeginPlay是从AActor的BeginPlay调用的,也就是Super::BeginPlay()这一行就有一部分是蓝图中BeginPlay的内容。把这一行去掉的话,AActor的BeginPlay就不会执行,自然蓝图中的BeginPlay也不会执行。
所以就可以通过Super::BeginPlay()来指定自己的代码哪些需要在蓝图BeginPlay前,哪些在后。
通过将蓝图复制粘贴出来看到以下信息:
这个信息表明这个节点是直接继承的Actor,这样就可以解释这个奇怪的现象了,至于蓝图怎么跟继承的C++类产生联系,还需要去看一下源码,了解生成宏的机制。