UE4:四种加载资源的方式

转自:https://blog.csdn.net/zhangxsv123/article/details/79707686函数

第一种: 若是该蓝图有C++类(或者说是从C++类建立的蓝图),直接进行加载spa

ATemp* spawnActor = GetWorld()->SpawnActor<ATemp>(ATemp::StaticClass());  

全部的加载资源并建立到场景中的方式都离不开SpawnActor这一句代码.若是你的蓝图包含了C++类,那么能够直接访问类的StaticClass.net

 

剩下的加载方式均是单纯的加载蓝图,并无对应的C++类code

第二种: 经过ConstructorHelpers来加载blog

static ConstructorHelpers::FClassFinder<AActor> bpClass(TEXT("/Game/BluePrint/TestObj"));  
if(bpClass.Class != NULL)  
{ 
    GetWorld()->SpawnActor(bpClass.Class);  
} 

FClassFinder是一个结构体,其中的Class成员变量是TSubClassof<T>类型的.因此咱们只须要SpawnActor(bpClass.Class)就能够生成咱们要的东西了ip

 

可是值得一提的是该方法只能在类的构造函数中使用,若是在普通的逻辑代码中嵌套这份代码,极可能引发整个编译器的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类的做用主要是经过一个字符串,找到该字符串所对应的资源.或者经过给定的资源,找到该资源所对应的在项目中的路径,也就是前面所说的字符串it

其中,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"));  
}  

原理的话几乎是和第三种是同样的.只是调用的方式不一样而已.在这里就再也不赘述了.

 

总结下来,第三种和第四种应该是最通用的.由于第一种要求有对应的蓝图C++类,而第二种又要求必定要是在构造函数中完成(不管是在谁的构造函数均可以,但该方法必定只能在构造函数中调用)...

相关文章
相关标签/搜索