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++類,而第二種又要求必定要是在構造函數中完成(不管是在誰的構造函數均可以,但該方法必定只能在構造函數中調用)...

相關文章
相關標籤/搜索