今天遇到了一個詭異的問題,經過幾個小時的煎熬終於找到了原因。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++類產生聯系,還需要去看一下源碼,了解生成宏的機制。