UE4 C++BeginPlay And BlueprintBeginPlay


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM