Lyra的Modular Gameplay InitState 狀態(tài)初始化鏈條 The Final Part

各位好,我是Diarica,今天帶大家來(lái)共同探索Lyra 中的Modular Gameplay初始化鏈條的基本結(jié)構(gòu)(2)
上一期我們一起了解了Modular Gameplay中一些重要的類(lèi),這一期我們會(huì)直接圍繞著接口去講它整個(gè)初始化的流程。您跟著這兩期文章,應(yīng)當(dāng)是可以在自己的項(xiàng)目中實(shí)現(xiàn)它。
我們這期會(huì)拿Lyra的PawnExtensionComponent舉例,See how it works
看完以后你可以拿自己的項(xiàng)目去接入這個(gè)初始化鏈條。

我們得知,PawnExtension是添加到Lyra游戲中所有Pawn的,它主要用來(lái)負(fù)責(zé)PawnData,ASC的初始化工作。

在頭文件中,可以看到PawnExt重寫(xiě)了以下虛函數(shù),以及一個(gè)靜態(tài)的FName。這個(gè)靜態(tài)的FName是用于標(biāo)記當(dāng)前組件的名稱以用于初始化。

它在構(gòu)造函數(shù)的上方
InitState的注冊(cè)
OnRegister中

OnRegister是ActorComponent的一個(gè)虛函數(shù),PawnExt重寫(xiě)了它,旨在更早的完成對(duì)InitState鏈條的注冊(cè)。在這之前也檢查了必備的PawnExt組件的數(shù)量,如果玩家類(lèi)上超過(guò)1個(gè),那么就觸發(fā)Ensure。
BeginPlay中

可以看到,Beginplay中綁定了當(dāng)初始化狀態(tài)鏈條變更時(shí)的通知,這里我要說(shuō)一下,去翻了ModularGameplay它的實(shí)現(xiàn),我發(fā)現(xiàn)它最終是來(lái)到了 OnActorInitStateChanged這個(gè)函數(shù)之下,PawnExt也實(shí)現(xiàn)了它。
同樣的,這里也嘗試轉(zhuǎn)換狀態(tài)為Spawned,就是剛剛生成完玩家。
嘗試轉(zhuǎn)換狀態(tài)需要調(diào)用TryToChangeInitState這個(gè)接口。
EndPlay中 取消注冊(cè)InitStateFeature

逐一講解每個(gè)函數(shù)的作用。
CheckDefaultInitialization

這個(gè)函數(shù),主要是檢查當(dāng)前狀態(tài)的初始化是否完成,是否可以進(jìn)入下一個(gè)狀態(tài)。
在Lyra中,一些關(guān)鍵對(duì)象(如PlayerController PlayerState)的OnRep時(shí)會(huì)調(diào)用它,來(lái)檢查初始化是否完畢。它的用法詳見(jiàn)下張圖和下張圖的注釋。

OnActorInitStateChanged

它是上文提到的,用BindOnActorInitStateChanged();綁定的回調(diào)??梢越壎ǜ碌街付顟B(tài)后的回調(diào),也可以響應(yīng)所有狀態(tài)的變化,在PawnExt里是響應(yīng)所有狀態(tài)的變化。
PawnExt里做的事情:當(dāng)其他的對(duì)象已經(jīng)初始化到DataAvailable狀態(tài),嘗試轉(zhuǎn)換到DataInitialized狀態(tài)。
HandleToChangeInitState

在PawnExt中,沒(méi)有特殊處理,主要是交給了HeroComponent。
GetFeatureName

這里顧名思義,獲取那個(gè)唯一的FName,標(biāo)識(shí)著實(shí)現(xiàn)了這個(gè)接口的類(lèi)。
CanChangeInitState
這個(gè)是IGameFrameworkInitStateInterface中最復(fù)雜的一個(gè)方法,它的作用是檢查我們當(dāng)前的初始化是否完成。如果完成后,return true,可以過(guò)渡到下一個(gè)狀態(tài)。

重點(diǎn):Current State是你當(dāng)前的狀態(tài),DisiredState是詢問(wèn)是否可以轉(zhuǎn)換到的狀態(tài)。
你需要在這里做你自己的一系列判定,判定這個(gè)狀態(tài)的初始化是否已完成。
如:
xx屬性在客戶端是否有效?
UGameFrameworkComponentManager的靜態(tài)函數(shù)
SendGameFrameworkComponentExtensionEvent

這里主要是當(dāng)某些特定的內(nèi)容初始化完成后發(fā)送的消息,同樣的,也可以綁定特定消息的委托。
例如在HeroComponent中,輸入綁定完成后的消息。
到這里,我們的Modular Gameplay初始化鏈條就講完了。
確實(shí)是比較簡(jiǎn)潔的系統(tǒng),把實(shí)現(xiàn)逐一拆解就明白了用法。
自然原理也似乎不是那么的難,你也可以自己嘗試實(shí)現(xiàn)一個(gè)初始化鏈條。
下次再見(jiàn)!
