不知道是Unreal Runtime變嚴格了還是還是框架有變,官方視頻4.09貌似就沒有報錯:不允許指向不完整的類型,可能是Unreal把導出的runtime給精簡了,我用4.24兩個Component都需要自己手動引用.h文件。
好在通過VS大概能確定需要引用哪個.h,不然我還要全網搜索太麻煩。
// SpawnVolumn.h
private:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Spawning",
meta = (AllowPrivateAccess = "true"))
class UBoxComponent* whereToSpawn;
// SpawnVolumn.cpp
FVector ASpawnVolumn::GetRandomPositionVolumn()
{
// 編譯器報錯:whereToSpawn不允許指針指向不完整的類類型
FVector SpawnOrigin = whereToSpawn->CalcBounds().Origin;
FVector SpawnExtend = whereToSpawn->GetScaledBoxExtent();
return UKismetMathLibrary::RandomPointInBoundingBox(SpawnOrigin, SpawnExtend);
}
class UBoxComponent其實我是不知道這個UBoxComponent定義在哪里,官方視頻里也沒有去引用某個.h文件,好在VS足夠強大,右鍵‘轉到定義’,VS會索引到幾個UBoxComponent相關.h,一般引用文件在Engine下
需要手動寫明引用頭文件#include "Runtime/Engine/Classes/Components/BoxComponent.h"
后續一系列的“不允許指針指向不完整的類類型”報錯都可以用這種方式解決。
又遇到個pointer to incomplete class type is not allowed
感嘆下Unity選擇C#作為游戲開發語言非常明智,倒不是說運行速度有多快,代碼質量有多高,但新手友好不容易踩坑浪費一些時間在代碼編譯上,雖然說藍圖連線小白,但我一個程序敲代碼更順手不用記那些框框名稱,有IDE為我補全,再次吐槽下Unreal對IDE的智能補全支持不好。
C++各種認真寫代碼的格式我認,但是pointer to incomplete class type is not allowed報錯在我已經引用了頭文件后依然固執標紅,害我在VS這糾結好久,其實你去Unreal里編譯是通過的,煩人!
來看下我遇到的問題:
就是這個萬惡紅波浪線。
其實在Unreal里編譯出錯會具體告訴你:缺少頭文件定義,我需要在當前xxxGameMode.cpp中引用這個ACharacter class定義的頭文件,有兩種方式找到這個頭文件位置。
- Unreal官方文檔
- 在VS中用F12 Go to Definition找到這個類定義文件。
引用Character.h完后再編譯報錯提示USpawnMovementComponent未定義,因此還需要為myCharacter->GetMovementComponent()引入PawnMovementComponent.h
所以這一行代碼其實是需要引入兩個.h
#include "GameFramework/Character.h"
#include "GameFramework/PawnMovementComponent.h"
最后感嘆:Unity C#用起來真舒服。