DEMO源代碼
這個DEMO演示了在C++代碼中,創建UE4的常見類型的對象,包括Actor,ActorComponent,加載資源等。
源代碼請從這裏下載:https://github.com/neil3d/UnrealCookBook
使用的引擎版本爲:4.11.2
打開項目後,啓動“CreateObjectDemo/CreateObjectDemoMap.umap”地圖文件即可運行。
創建組件
在UE4中,爲Actor創建組件,可以使用UObject::CreateDefaultSubobject()模板函數,這個函數只能在構造函數中調用。如下所示:
/* <CreateObjectDemo>
* 創建Component對象,要使用CreateDefaultSubobject模板函數
*/
MyComponent = CreateDefaultSubobject<UMyActorComponent>(TEXT("MyComponent"));
加載資源對象
在UE4中,項目中的所有資源文件,不要看做是文件,而要理解爲“靜態對象”:也就是對象序列化的產物。加載項目資源可以使用“UObject::StaticLoadObject()”函數,其中重要的參數爲對象的Name,而不是文件路徑。UE底層提供文件讀取功能,無論資源文件是存儲我獨立的.uasset文件,還是存儲到.PAK文件中,對於上層都不需要關心。
/* <CreateObjectDemo>
* 加載模型、貼圖等對象,使用StaticLoadObject函數
*/
UStaticMesh* SM_Vase = Cast<UStaticMesh>(StaticLoadObject(UStaticMesh::StaticClass(),
NULL,
TEXT("/Game/Assets/StaticMeshes/SM_Vase"))
);
StaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComponent"));
StaticMeshComponent->SetStaticMesh(SM_Vase);
創建Actor對象
創建Actor對象,需要使用UWorld::SpawnActor()接口,如下所示:
/* <CreateObjectDemo>
* 創建AActor派生類對象不要用NewObject或者new,而要用UWorld::SpawnActor()
*/
UWorld* World = GetWorld();
FVector pos(150, 0, 20);
AMyActor* MyActor = World->SpawnActor<AMyActor>(pos, FRotator::ZeroRotator);
創建UObject對象
如果你有UObject的派生類(非Actor、非ActorComponent),那你可以使用NewObject()模板函數來創建其實例對象。
/* <CreateObjectDemo>
* 使用NewObject模板函數,來創建UObject派生類對象
*/
MyObject = NewObject<UMyObject>();