UE4:四种加载资源的⽅式
第⼀种: 如果该蓝图有C++类(或者说是从C++类创建的蓝图),直接进⾏加载
ATemp* spawnActor = GetWorld()->SpawnActor<ATemp>(ATemp::StaticClass());
所有的加载资源并创建到场景中的⽅式都离不开SpawnActor这⼀句代码.如果你的蓝图包含了C++类,那么可以直接访问类的StaticClass
剩下的加载⽅式均是单纯的加载蓝图,并没有对应的C++类
第⼆种: 通过ConstructorHelpers来加载
static ConstructorHelpers::FClassFinder<AActor> bpClass(TEXT("/Game/BluePrint/TestObj"));
if(bpClass.Class != NULL)
{
GetWorld()->SpawnActor(bpClass.Class);
}
FClassFinder是⼀个结构体,其中的Class成员变量是TSubClassof<T>类型的.所以我们只需要SpawnActor(bpClass.Class)就可以⽣成我们要的东西了
但是值得⼀提的是该⽅法只能在类的构造函数中使⽤,如果在普通的逻辑代码中嵌套这份代码,很可能引起整个编译器的crash.以下是该代码的具体执⾏步骤
struct FClassFinder
{
TSubclassOf<T> Class;
FClassFinder(const TCHAR* ClassToFind)
{
CheckIfIsInConstructor(ClassToFind);
FString PathName(ClassToFind);
StripObjectClass(PathName, true);
Class = ConstructorHelpersInternal::FindOrLoadClass(PathName, T::StaticClass());
ValidateObject(*Class, PathName, *PathName);
}
bool Succeeded()
{
return !!*Class;
}
};
不难看出该⽅法在⼀开头的地⽅就先检查了是否在构造函数中.CheckIfIsInConstructor,,如果不是的话可能会引起crash(具体原因不明)...然后通过路径去到我们要加载的类,并返回给我们.另外⼀点,该变量必须是static的...
第三种: 通过FStringAssetReference来加载
FStringAssetReference asset = "Blueprint'/Game/BluePrint/TestObj.TestObj'";
UObject* itemObj = asset.ResolveObject();
UBlueprint* gen = Cast<UBlueprint>(itemObj);
if (gen != NULL)
{
AActor* spawnActor = GetWorld()->SpawnActor<AActor>(gen->GeneratedClass);
}
FStringAssetReference类的作⽤主要是通过⼀个字符串,到该字符串所对应的资源.或者通过给定的资源,到该资源所对应的在项⽬中的路径,也就是前⾯所说的字符串
其中,asset.ResolveObject就是查字符串对应的资源,返回⼀个UObejct,我们通过将其转化成UBlueprint类型然后再去的他的GenerateClass 即可.
第四种:  通过StaticLoadObject来加载
UObject* loadObj = StaticLoadObject(UBlueprint::StaticClass(), NULL, TEXT("Blueprint'/Game/BluePrint/TestObj.TestObj'"));
if (loadObj != nullptr)
{
UBlueprint* ubp = Cast<UBlueprint>(loadObj);
AActor* spawnActor = GetWorld()->SpawnActor<AActor>(ubp->GeneratedClass);
UE_LOG(LogClass, Log, TEXT("Success"));
}字符串函数strip的作用
原理的话⼏乎是和第三种是⼀样的.只是调⽤的⽅式不同⽽已.在这⾥就不再赘述了.
总结下来,第三种和第四种应该是最通⽤的.因为第⼀种要求有对应的蓝图C++类,⽽第⼆种⼜要求⼀定要是在构造函数中完成(不论是在谁的构造函数都可以,但该⽅法⼀定只能在构造函数中调⽤)...

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。