UE4學習:四種加載資源的方式

第一種: 如果該藍圖有C++類(或者說是從C++類創建的藍圖),直接進行加載

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

所有的加載資源並創建到場景中的方式都離不開SpawnActor這一句代碼.如果你的藍圖包含了C++類,那麼可以直接訪問類的StaticClass


剩下的加載方式均是單純的加載藍圖,並沒有對應的C++類

第二種: 通過ConstructorHelpers來加載

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

FClassFinder是一個結構體,其中的Class成員變量是TSubClassof<T>類型的.所以我們只需要SpawnActor(bpClass.Class)就可以生成我們要的東西了

但是值得一提的是該方法只能在類的構造函數中使用,如果在普通的邏輯代碼中嵌套這份代碼,很可能引起整個編譯器的crash.以下是該代碼的具體執行步驟

  1. struct FClassFinder  
  2. {  
  3.     TSubclassOf<T> Class;  
  4.     FClassFinder(const TCHAR* ClassToFind)  
  5.     {  
  6.     CheckIfIsInConstructor(ClassToFind);  
  7.     FString PathName(ClassToFind);  
  8.     StripObjectClass(PathName, true);  
  9.     Class = ConstructorHelpersInternal::FindOrLoadClass(PathName, T::StaticClass());  
  10.     ValidateObject(*Class, PathName, *PathName);  
  11.     }  
  12.     bool Succeeded()  
  13.     {  
  14.     return !!*Class;  
  15.     }  
  16. };  

不難看出該方法在一開頭的地方就先檢查了是否在構造函數中.CheckIfIsInConstructor,,如果不是的話可能會引起crash(具體原因不明)...然後通過路徑去找到我們要加載的類,並返回給我們.另外一點,該變量必須是static的...


第三種: 通過FStringAssetReference來加載

  1. FStringAssetReference asset = "Blueprint'/Game/BluePrint/TestObj.TestObj'";  
  2.     UObject* itemObj = asset.ResolveObject();  
  3.     UBlueprint* gen = Cast<UBlueprint>(itemObj);  
  4.     if (gen != NULL)   
  5.     {  
  6.         AActor* spawnActor = GetWorld()->SpawnActor<AActor>(gen->GeneratedClass);  
  7.     }*/  

FStringAssetReference類的作用主要是通過一個字符串,找到該字符串所對應的資源.或者通過給定的資源,找到該資源所對應的在項目中的路徑,也就是前面所說的字符串

其中,asset.ResolveObject就是查找字符串對應的資源,返回一個UObejct,我們通過將其轉化成UBlueprint類型然後再去的他的GenerateClass即可.


第四種:  通過StaticLoadObject來加載

  1. UObject* loadObj = StaticLoadObject(UBlueprint::StaticClass(), NULL, TEXT("Blueprint'/Game/BluePrint/TestObj.TestObj'"));  
  2. if (loadObj != nullptr)  
  3. {  
  4.     UBlueprint* ubp = Cast<UBlueprint>(loadObj);  
  5.     AActor* spawnActor = GetWorld()->SpawnActor<AActor>(ubp->GeneratedClass);  
  6.     UE_LOG(LogClass, Log, TEXT("Success"));  
  7. }  

原理的話幾乎是和第三種是一樣的.只是調用的方式不同而已.在這裏就不再贅述了.

總結下來,第三種和第四種應該是最通用的.因爲第一種要求有對應的藍圖C++類,而第二種又要求一定要是在構造函數中完成(不論是在誰的構造函數都可以,但該方法一定只能在構造函數中調用)...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章