UE4常用函數(shù)--資源加載

游戲中的角色、場(chǎng)景、道具等都需要美術(shù)資源來進(jìn)行設(shè)計(jì),高精度的模型、貼圖和光影效果可以帶來更加逼真的游戲場(chǎng)景和角色形象,提升游戲的沉浸感和互動(dòng)性。因此,在游戲開發(fā)中,美術(shù)資源加載成為經(jīng)常使用的操作,正確的選擇加載資源方法,將會(huì)使得游戲性能和畫面展現(xiàn)得到較好的結(jié)合。下面,我們一起來了解下UE4中的資源加載方法。

# 01
資源加載分類
UE4中根據(jù)不同的分類標(biāo)準(zhǔn),可以劃分為不同的加載情況:
●?靜態(tài)加載和動(dòng)態(tài)加載
根據(jù)加載的時(shí)機(jī),資源加載可以分為靜態(tài)加載和動(dòng)態(tài)加載。
靜態(tài)加載主要是在構(gòu)造函數(shù)中完成的加載方式,而在構(gòu)造函數(shù)之外的加載都稱為動(dòng)態(tài)加載。
UE4中UObject派生的類,構(gòu)造函數(shù)是在引擎初始化階段調(diào)用的,導(dǎo)致靜態(tài)加載過程也是在引擎初始化階段完成的,即當(dāng)類默認(rèn)對(duì)象(CDO)被創(chuàng)建時(shí)實(shí)現(xiàn)的。因此,靜態(tài)加載一個(gè)資源時(shí),如果它所需的其他資源沒有預(yù)加載,則會(huì)加載失敗。
即靜態(tài)加載是在引擎初始化階段完成加載的,而非創(chuàng)建類的對(duì)象才加載(涉及到UE4啟動(dòng)類型注冊(cè)流程)。如果大量資源采取了靜態(tài)加載的方法,會(huì)使得游戲啟動(dòng)緩慢。
●?加載非藍(lán)圖資源和藍(lán)圖資源
根據(jù)加載的對(duì)象不同,可以分為加載非藍(lán)圖資源和加載藍(lán)圖資源
加載藍(lán)圖一般使用Class相關(guān)的加載函數(shù),加載的是類對(duì)象,而非藍(lán)圖資源一般使用LoadObject函數(shù),直接加載資源對(duì)象。
類型安全:LoadClass函數(shù)可以確保加載的藍(lán)圖資源類型安全,避免了在運(yùn)行時(shí)出現(xiàn)類型錯(cuò)誤的問題。而LoadObject函數(shù)是一種通用的加載函數(shù),它不能保證加載的資源類型安全。
編譯時(shí)檢查:LoadClass函數(shù)可以在編譯時(shí)進(jìn)行類型檢查,避免出現(xiàn)潛在的錯(cuò)誤。而LoadObject函數(shù)是一種運(yùn)行時(shí)函數(shù),它不能在編譯時(shí)進(jìn)行類型檢查。
LoadClass函數(shù)可以預(yù)先加載藍(lán)圖資源,避免在游戲運(yùn)行時(shí)出現(xiàn)延遲
●?同步加載和異步加載
同步加載是指程序需要等待資源加載結(jié)束后才會(huì)繼續(xù)向下執(zhí)行,如果加載資源比較大,可能導(dǎo)致游戲卡頓;
為了避免上述情況,需要采用異步加載的方法;異步加載雖然是游戲性能得到提升,但是實(shí)現(xiàn)方法也更加復(fù)雜,將在另一篇文章中詳述。

# 02
代碼實(shí)現(xiàn)
在UE4工程中新建TestActor的AActor?C++類;
●?靜態(tài)加載藍(lán)圖資源
靜態(tài)加載藍(lán)圖資源的話,在ATestActor的構(gòu)造函數(shù)中可以使用static?ConstructorHelpers::FObjectFinder或者static?ConstructorHelpers::FClassFinder來實(shí)現(xiàn),定義BPLight或BpClass對(duì)象時(shí),需要傳入資源路徑作為參數(shù)。
不過在引擎啟動(dòng)的過程中,提示加載失敗了,靜態(tài)藍(lán)圖資源加載限制還是比較大的。

●?靜態(tài)加載非藍(lán)圖資源
同樣在在ATestActor的構(gòu)造函數(shù)中,定義StaticMesh對(duì)象時(shí),傳入靜態(tài)網(wǎng)格資源路徑參數(shù)。

查看日志位置,是在引擎啟動(dòng)階段輸出的,并非游戲運(yùn)行階段。
●?動(dòng)態(tài)加載藍(lán)圖資源
在ATestActor的BeginPlay()函數(shù)中,使用LoadClass,模塊類名填藍(lán)圖資源的基類名;
LoadClass函數(shù)定義如下:即封裝了StaticLoadClass函數(shù),然后對(duì)一些非必填的參數(shù)設(shè)置了默認(rèn)值。實(shí)際中,也可以根據(jù)自己的需要設(shè)置這些參數(shù)的值。

藍(lán)圖資源加載成功后,如果要轉(zhuǎn)換為Actor,需要將UClass對(duì)象傳遞到SpawnActor函數(shù)中
●?動(dòng)態(tài)加載非藍(lán)圖資源類
在ATestActor的BeginPlay()函數(shù)中,使用LoadObject函數(shù),模板參數(shù)填資源所屬類型名;

LoadObject和LoadClass類似,也是封裝了StaticLoadObject函數(shù),并設(shè)置了一些非必填的默認(rèn)值。
在以上加載資源函數(shù)中,使用的資源路徑可以通過在引擎中選擇資源,右鍵“復(fù)制引用”來獲取。如果是加載藍(lán)圖資源的話,還得在末尾增加"_C"。


# 03
小結(jié)
●?UE4中資源加載的分類
●?靜態(tài)、動(dòng)態(tài)、藍(lán)圖和非藍(lán)圖資源加載
●?藍(lán)圖資源路徑需要加后綴_C
●?本文所介紹的方法都是同步加載