一、对象与销毁
1. 纯C++类的创建与销毁
创建: 对于纯C++类(这里指非继承自UObject的类,一般以F开头),可以通过new来创建对象,并使用TSharedPtr和TSharedRef来管理对象。
TSharedPtr<MyClass> MyClassPtr = MakeShareable(new MyClass());
销毁: 使用智能指针的计数器方法,自动销毁
2. UObject及其子类创建与销毁
创建: 继承自UObject但不继承自Actor的类可以通过NewObject来创建对象,并由UE4引擎来管理对象
UObjectClass* MyClass = NewObject<UObjectClass>();
销毁: 垃圾回收机制自动回收
3. AActor及其子类的创建与销毁
创建: 继承自AActor的类,使用SpawnActor来创建对象,SpawnActor有七个重载函数
AActorClass* MyClass = GetWorld()->SpawnActor<AActorClass>(NewLocation, NewRotation);
销毁: 使用Destroy函数请求销毁,回收时间由引擎决定
二、Component创建
1. 构造器中创建组件
当我们在构造器中初始化组件时,可以使用CreateDefaultSubobject函数来创建。并且此函数只能在构造器中使用而不能再BeginPlay等函数中使用!
UMySceneComponent* MySceneComponent = CreateDefaultSubobject<UMySceneComponent>(TEXT("MySceneComponent"));
2. 其它函数中创建组件
因为Component继承自UObject类,所以我们在其它函数中也可以像创建UObject子类一样,使用NewObject函数来创建组件。但是,创建组件后,我们需要使用RegisterComponent或RegisterAllComponents函数将其注册才能使其生效。
UStaticMeshComponent* MyMeshComp = NewObject<UStaticMeshComponent>(this, TEXT("MyMeshComp"));
MyMeshComp->SetupAttachment(RootComponent);
MyMeshComp->SetRelativeLocation(FVector(0.f, 0.f, 0.f));
UStaticMesh* StaticMesh = LoadObject<UstaticMesh>(NULL, TEXT("StaticMesh'/Game/StaticMesh.StaticMesh'"));
// UStaticMesh* StaticMesh = LoadObject<UstaticMesh>(NULL, TEXT("/Game/StaticMesh.StaticMesh")); 去掉 StaticMesh 前缀也可以
MyMeshComp->SetStaticMesh(StaticMesh);
MyMeshComp->RegisterComponent();
//RegisterAllComponents();
三、资源获取
资源分为美术资源和蓝图资源,我们分别使用不同函数获取到C++中使用。
1. 构造器中加载资源
蓝图资源加载
(1)如果要在构造器中将蓝图资源加载到C++中使用,可以使用FClassFinder来获取蓝图类
// 第一种方式,带_C后缀,这是以前的方式
static ConstructorHelpers::FClassFinder<AActor> MyActorBP(TEXT("Blueprint'/Game/MyActorBP.MyActorBP_C'"));
// 第二种方式,新方式,更好一些
static ConstructorHelpers::FClassFinder<AActor> MyActorBP(TEXT("/Game/MyActorBP"));
TSubclassOf<AActor> MyActorClass = MyActorBP.Class;
(2)使用第一种方式时,我们可以直接通过复制内容浏览器中的资源获取其地址,但如果直接通过其地址去加载资源,会发现找不到资源。我们可以通过两种方式来解决此问题。
- 在BP路径后加_C:如上例地址:Blueprint'/Game/MyActorBP.MyActorBP_C'
- 去掉路径前缀、单引号,后缀,只保留路径:如上例地址改为:/Game/MyActorBP.MyActorBP
(3)我们可以使用UClass*或TSubclassOf来获取其类指针
UClass* MyActorClass = MyActorBP.Class;
TSubclassOf<AActor> MyActorClass = MyActorBP.Class;
美术资源加载
(1)在构造器中如需要加载美术资源到C++中使用,可以使用FObjectFinder来获取资源
static ConstructorHelpers::FObjectFinder<UStaticMesh> StaticMesh(TEXT("StaticMesh'/Game/StaticMesh.StaticMesh'"));
//static ConstructorHelpers::FObjectFinder<UStaticMesh> StaticMesh(TEXT("/Game/StaticMesh.StaticMesh")); // 去掉StaticMesh前缀也可以
MeshComp->SetStaticMesh(StaticMesh.Object);
(2)美术(对象)资源可以直接输入其地址,而不需要对其路径进行修改。
2. 其它函数中加载资源
蓝图资源加载
使用LoadClass函数加载蓝图类
// 方式一,带_C后缀
UClass* MyActorClass = LoadClass<AActor>(NULL, TEXT("Blueprint'/Game/MyActorBP.MyActorBP_C'"));
// 方式二
UClass* MyActorClass = LoadClass<AActor>(NULL, TEXT("/Game/MyActorBP"));
第一种方式对路径的要求与FClassFinder一样,需要在最后加_C
美术资源加载
使用LoadObject函数加载美术资源
UStaticMesh* StaticMesh = LoadObject<UstaticMesh>(NULL, TEXT("StaticMesh'/Game/StaticMesh.StaticMesh'")); // 去掉StaticMesh也可以
LoadObject()可以加载的文件类型包括: Texture, Material, SoundCue, SoundWave, ParticlesSystem, AnimMontage, BlendSpace(1D, 2D, 3D), AnimSequence, AnimBlueprint, SkeletalMesh等。
备注
FObjectFinder、FClassFinder和LoadClass都是对LoadObject的封装。