国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網 會員登陸 & 注冊

Lyra的數據驅動之數據加載與引用

2022-04-27 16:37 作者:叮丁貓er  | 我要投稿

知乎同文:
Lyra的數據驅動之數據加載與引用 - 知乎 (zhihu.com)


Lyra是UE5發(fā)布的一個非常完整的案例項目,它包括了UE5的GameFeature,GamePlayAbility,EnhancedInput,EOS,ModularGamePlay,ModularGamePlayActors的整合使用,可以讓我們更完整的學習幾個大型插件的整合使用,大部分只需要配置文件就可以處理大量的代碼和功能,提高獨立游戲的開發(fā)效率,易于拓展的游戲架構,是不可多得的高質量學習項目。


個人比較菜第一次寫這種項目分析文章,只是自己學習的一些拙見,也是記錄,更好的了解這個項目的架構和各個部分的配置到底是怎樣加載怎樣引用的。文章盡量詳細的說明流程,但是任然可能會有一些跳躍,需要自行查看其他代碼。如有紕漏請指正,避免誤人子弟。


Lyra的數據驅動圍繞LyraExperienceDefinition(DataAsset)。

一. 入口


默認關卡中B_ExperienceList3D(Actor)主要作用是收集顯示LyraUserFacingExperienceDefinition(主體LyraExperienceDefinition)配置以及生成關卡選擇碰撞物體。




CommonSession_HostSessionRequest中Experience是ExperienceID.PrimaryAssetName其實就是LyraExperienceDefinition資源的Name


HostSession經過一系列的判斷最后構造TravelURL,創(chuàng)建在線步驟基本相同。


ConstructTravelURL中將Experience從之前ExtraArgs參數中取出拼接TravelURL,最后調用Sessions->CreateSession進行創(chuàng)建session。

二. Experience的加載


在GameMode的InitGame中重寫了一個下一幀執(zhí)行的Timer,通過Timer中的函數從創(chuàng)建Level的參數中取到Experience的Name構造FPrimaryAssetId,再通過OnMatchAssignmentGiven函數去設置GameState下LyraExperienceManagerComponent的ExperienceId用于加載。


這個沒有什么好說的就加載Experience指針賦值給LyraExperienceManagerComponent的CurrentExperience再調用StartExperienceLoad開始加載Experience配置里的文件。那客戶端怎么辦呢?我們可以看到CurrentExperience是一個使用ReplicatedUsing綁定了回調函數的變量,當CurrentExperience被設置后參生變化就會復制到客戶端進行調用OnRep_CurrentExperience函數。OnRep_CurrentExperience中也就調用了StartExperienceLoad。


我們先來看看LyraExperienceDefinition里面有什么東西。

  • GameFeaturesToEnable ? 需要激活的GameFeature

  • DefaultPawnData ? ? ? ? ? ? 關于Pawn的PawnClass,Ability,Input

  • ActionSets ? ? ? ? ? ? ? ? ? ? ? ?Action的其他資源引用

  • Actions ? ? ? ? ? ? ? ? ? ? ? ? ? ? GameFeature中的Actions


打包資源set,將Experience自身和Experience->ActionSets都Add進BundleAssetList。標記資源是在服務器還是客戶端加載。


之后收集所有的GameFeature的URLs進行加載激活,再調用OnExperienceFullLoadCompleted。


OnExperienceFullLoadCompleted中把Experience->ActionSet->Actions進行注冊/加載/激活。至于GameFeature的組件Add流程和詳情請參考大釗的GameFeature系列文章。截止到目前為止Experience的大部分資源已經被加載了。

三. Experience的引用

查找OnExperienceLoaded委托可以看見CallOrRegister_OnExperienceLoaded函數,再繼續(xù)查找CallOrRegister_OnExperienceLoaded被誰調用。


查找結果中我們可以看到在Gamemode中和Playerstate中都進行的調用。先看LyraPlayerState::PostInitializeComponents中綁定了OnExperienceLoaded方法作為加載完成后的調用方法。OnExperienceLoaded方法是獲取Experience中提到的PawnData。我們可以推測GetPawnDataForController中是通過獲取Playerstate下的LyraExperienceManagerComponent組件里的Experience對象中的PawnData。


從GetPawnDataForController中看出也確實是這樣,只不過加了一段直接去PlayerState中獲取,因為有可能已經被賦值了。被賦值了直接返回,否則從LyraExperienceManagerComponent中獲取。

現(xiàn)在回到LyraPlayerState::OnExperienceLoaded中SetPawnData。SetPawnData判斷是否具有服務器權限,如果有就將PawnData->AbilitySets中的所有技能都一一GiveToAbilitySystem去。最后強制網絡更新,將技能賦予也復制更新到客戶端。


截止到目前位置Pawn的技能賦予就已經完成。

四. Experience其他引用

剛剛我們看完了Gamemode的InitGame(),接下來是GetDefaultPawnClassForController、SpawnDefaultPawnAtTransform兩個比較重要的復寫。


ALyraGameMode::GetDefaultPawnClassForController比較簡單就是使用Experience下的PawnClass生成Pawn。ALyraGameMode::SpawnDefaultPawnAtTransform中查找Pawn下的LyraPawnExtensionComponent組件賦值PawnData。PawnData任然是復制變量,通過OnRep_PawnData進行客戶端的執(zhí)行CheckPawnReadyToInitialize(),服務器直接調用CheckPawnReadyToInitialize()。


LyraPawnExtensionComponent::CheckPawnReadyToInitialize通過一系列判斷是否完成Pawn初始化最后通過OnPawnReadyToInitialize委托廣播出去。


搜索OnPawnReadyToInitialize_RegisterAndCall我們可以看見在LyraHeroComponent::OnRegister中被綁定了ULyraHeroComponent::OnPawnReadyToInitialize函數。


在LyraHeroComponent::OnPawnReadyToInitialize下這里可以看見InitializeAbilitySystem和InitializePlayerInput,我們先看InitializeAbilitySystem,傳入了位于PlayerState中的GamePlayAbility組件指針。


LyraPawnExtensionComponent::InitializeAbilitySystem中把傳入進來的GamePlayAbility指針賦值給LyraPawnExtensionComponent的AbilitySystemComponent然后再設置Tag的關系映射,也就是之前在PawnData中的技能賦值下面配置的SetTagRelationshipMapping??梢钥闯鯯etTagRelationshipMapping提供了以后技能Tag之間的作用關系。


我們再回到LyraHeroComponent::OnPawnReadyToInitialize下的InitializePlayerInput。InitializePlayerInput首先將本地的輸入設置進行了激活,然后將Extension->PawnData->InputConfig進行的BindAbilityActions技能Action綁定/BindNativeAction普通Action綁定。


到目前為止基本算是結束了,后面文章看時間可能會寫關于GameFeature自定義AddComponent的文章。也就是Lyra項目中的UI也是通過配置來進行的。

項目還是看了很久,這篇文章也花了半天多。若有收獲請點個贊或者留言支持下。



Lyra的數據驅動之數據加載與引用的評論 (共 條)

分享到微博請遵守國家法律
文水县| 巴林右旗| 金川县| 定结县| 工布江达县| 肥东县| 琼结县| 洪江市| 三原县| 博白县| 泉州市| 灵山县| 克东县| 澜沧| 十堰市| 定远县| 怀柔区| 贡嘎县| 香港 | 朝阳区| 饶河县| 宽城| 赫章县| 建湖县| 水富县| 呼玛县| 边坝县| 太仆寺旗| 开平市| 图木舒克市| 琼结县| 习水县| 镶黄旗| 平阴县| 隆德县| 鄢陵县| 盐源县| 甘德县| 古田县| 台山市| 木兰县|