【UE4基础】对象创建与资源获取

一、对象与销毁

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的封装。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值