Lyra框架01:游戲玩法是怎么開啟的?
在Lyra框架下,Epic將每一次對局定義為一個(gè)Experience實(shí)例。
Lyra在WorldSetting數(shù)據(jù)結(jié)構(gòu)內(nèi)新增了一個(gè)字段叫DefaultGameplayExperience,設(shè)計(jì)者可以通過配置這個(gè)值來改變每張地圖內(nèi)所使用的Experience模板。
當(dāng)這個(gè)World(地圖)被加載后,在GameMode的初始化函數(shù)(ALyraGameMode::InitGame)里調(diào)用了如下函數(shù),意味著下一幀跑HandleMatchAssignmentIfNotExpectingOne這個(gè)函數(shù):
GetWorld()->GetTimerManager().SetTimerForNextTick(this, &ThisClass::HandleMatchAssignmentIfNotExpectingOne);
而在這個(gè)函數(shù)里,會(huì)讀取當(dāng)前World配置的DefaultGameplayExperience。然后通過GameState上的ULyraExperienceManagerComponent,開始加載Experience里配置的內(nèi)容。
ULyraExperienceManagerComponent* ExperienceComponent = GameState->FindComponentByClass<ULyraExperienceManagerComponent>();
check(ExperienceComponent);
ExperienceComponent->ServerSetCurrentExperience(ExperienceId);
這里注意GameState是在GameMode的基類里,很早的地方就實(shí)例化了。
void AGameModeBase::PreInitializeComponents()
...
UWorld* World = GetWorld();
GameState = World->SpawnActor<AGameStateBase>(GameStateClass, SpawnInfo);
World->SetGameState(GameState);
...
InitGameState();
LyraGameMode覆寫了InitGameState,加入了監(jiān)聽OnExperienceLoaded的邏輯。
Experience這個(gè)東西非常復(fù)雜,用到了GameFeature等各種特性來動(dòng)態(tài)加載Component、加UI、加Input等等,我們先忽略這些。當(dāng)這些邏輯都跑完了之后,會(huì)回調(diào)ALyraGameMode::OnExperienceLoaded。在這個(gè)函數(shù)里,重新生成了所有的PlayerController,游戲邏輯在此展開。