發表文章

目前顯示的是 1月, 2019的文章

揭密SpawnActor的BP節點

圖片
在BP的SpawnActor節點有個厲害的功能 就是你給不同的class type的話,這個節點會根據class type產生不同的樣貌,主要有兩個 1. return的actor type會是你傳入的class type,而不是基礎type actor,還要自己cast 2. 如果傳入的class有expose on spawn的變數,也會再這裡列舉出來讓你可以傳入 在說明細節之前,我們先看一下C++處理 expose on spawn的變數值是如何設定的。 AMyActor* pActor = SpawnActorDeferred; // Fill your variable here... FinishSpawningActor(pActor); 所以可以知道其實spawn一個擁有expose on spawn的actor是要作上述三個步驟的。 Spawn -> SetProperties -> FinishSpawn 如果因為某些因素沒呼叫到最後的FinishSpawn,程式的運作就會有問題。 而BP的SpawnActorFromClass只用了一個節點就作到上述三件事情,為了理解其中的奧妙,我花了一些時間追查,在這邊分享一下。 程式碼在 Engine\Source\Editor\BlueprintGraph\Classes\K2Node_SpawnActorFromClass.h 在function ExpandNode裡面,就是處理一個節點其實會分成三大節點的主函式。 static const FName BeginSpawningBlueprintFuncName = GET_FUNCTION_NAME_CHECKED(UGameplayStatics, BeginDeferredActorSpawnFromClass); static const FName FinishSpawningFuncName = GET_FUNCTION_NAME_CHECKED(UGameplayStatics, FinishSpawningActor); 上面兩行可以看到會從UGameplayStatics之中取出BeginDeferredActorSpawnFromClass以及FinishSpawnin