Lyra框架01:游戏玩法是怎么开启的?
在Lyra框架下,Epic将每一次对局定义为一个Experience实例。
Lyra在WorldSetting数据结构内新增了一个字段叫DefaultGameplayExperience,设计者可以通过配置这个值来改变每张地图内所使用的Experience模板。
当这个World(地图)被加载后,在GameMode的初始化函数(ALyraGameMode::InitGame)里调用了如下函数,意味着下一帧跑HandleMatchAssignmentIfNotExpectingOne这个函数:
GetWorld()->GetTimerManager().SetTimerForNextTick(this, &ThisClass::HandleMatchAssignmentIfNotExpectingOne);
而在这个函数里,会读取当前World配置的DefaultGameplayExperience。然后通过GameState上的ULyraExperienceManagerComponent,开始加载Experience里配置的内容。
ULyraExperienceManagerComponent* ExperienceComponent = GameState->FindComponentByClass<ULyraExperienceManagerComponent>();
check(ExperienceComponent);
ExperienceComponent->ServerSetCurrentExperience(ExperienceId);
这里注意GameState是在GameMode的基类里,很早的地方就实例化了。
void AGameModeBase::PreInitializeComponents()
...
UWorld* World = GetWorld();
GameState = World->SpawnActor<AGameStateBase>(GameStateClass, SpawnInfo);
World->SetGameState(GameState);
...
InitGameState();
LyraGameMode覆写了InitGameState,加入了监听OnExperienceLoaded的逻辑。
Experience这个东西非常复杂,用到了GameFeature等各种特性来动态加载Component、加UI、加Input等等,我们先忽略这些。当这些逻辑都跑完了之后,会回调ALyraGameMode::OnExperienceLoaded。在这个函数里,重新生成了所有的PlayerController,游戏逻辑在此展开。

