虚幻C++学习(三)

本文详细介绍了UnrealEngine中静态加载资源(如UStaticMesh和UParticleSystem)以及蓝图类(如AActor)的方法(FObjectFinder和FClassFinder),并与动态加载(通过LoadObject和LoadClass)进行了对比,强调了它们在构造时间和使用的限制。
摘要由CSDN通过智能技术生成

静态加载资源和蓝图类

什么是静态加载

就是代码编译时加载

静态加载资源

 方法:ConstructorHelper::FObjectFinder<Template>(资源路径)

    //方法一
    autp Mesh = ConstructorHelpers::FObjectFinder<UStaticMesh> TempStaticMesh(TEXT("/Script/Engine.StaticMesh'/Game/StarterContent/Shapes/Shape_Cone.Shape_Cone'"));

    //方法二
    static ConstructorHelpers::FObjectFinder<UStaticMesh> TempStaticMesh(TEXT("/Script/Engine.StaticMesh'/Game/StarterContent/Shapes/Shape_Cone.Shape_Cone'"));

使用加载的资源对象为蓝图变量赋值

	//UStaticMesh
	MyMesh->SetStaticMesh(TempStaticMesh.Object);
	//UParticleSystem
	MyParticle->SetTemplate(TempParticleSystem.Object);
	//USoundWave
	MyAudio->SetSound(TempSound.Object);

静态加载蓝图类

方法:ConstructorHelpers::FClassFinder<Template>(蓝图路径)

	static ConstructorHelpers::FClassFinder<AActor> TempMyActor(TEXT("/Script/Engine.Blueprint'/Game/StarterContent/Blueprints/Blueprint_CeilingLight.Blueprint_CeilingLight_C'"));

 注意路径后要加一个_C,不然会报错

FClassFinder和FObjectFinder共同点:

1. 只能在构造中调用,否则会Crash

2. 变量必须是Static类型,也可以用auto

3. 都调用LoadObject()

动态加载资源(同步加载)

什么是动态加载

就是游戏运行时加载

动态加载资源

方法: LoadObject

inline T* LoadObject( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr, const FLinkerInstancingContext* InstancingContext=nullptr )
{
	return (T*)StaticLoadObject( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox, true, InstancingContext );
}

StaticLoadObject的模板化,如果资源不存在会把路径转化为Package再调用LoadPackage

	UStaticMesh* MyTmpStaticMesh = LoadObject<UStaticMesh>(nullptr, TEXT("/Script/Engine.StaticMesh'/Game/StarterContent/Architecture/Wall_400x400.Wall_400x400''"));
	if (MyTmpStaticMesh) {
		MyMesh->SetStaticMesh(MyTmpStaticMesh);
	}

动态加载蓝图类

方法: LoadClass

inline UClass* LoadClass( UObject* Outer, const TCHAR* Name, const TCHAR* Filename=nullptr, uint32 LoadFlags=LOAD_None, UPackageMap* Sandbox=nullptr )
{
	return StaticLoadClass( T::StaticClass(), Outer, Name, Filename, LoadFlags, Sandbox );
}

内部调用LoadObject,根据Path得到的UClass进行判断,若类型不匹配会报错并返回NULL

	UClass* MyTempClass = LoadClass<AActor>(this, TEXT("/Script/Engine.Blueprint'/Game/StarterContent/Blueprints/Blueprint_CeilingLight.Blueprint_CeilingLight'"));
	if (MyTempClass) {
		AActor* SpawnActor = GetWorld()->SpawnActor<AActor>(MyTempClass, FVector::ZeroVector, FRotator::ZeroRotator);
	}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值