静态加载资源和蓝图类
什么是静态加载
就是代码编译时加载
静态加载资源
方法: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);
}