DEMO源代码
这个DEMO演示了在C++代码中,创建UE4的常见类型的对象,包括Actor,ActorComponent,加载资源等。
源代码请从这里下载:https://code.csdn.net/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>();