目录
- 前言
- [1 创建](#1 创建)
- [2 加载](#2 加载)
- [3 Deactivate](#3 Deactivate)
- [4 总结与图示](#4 总结与图示)
前言
这篇主要将视角放在Experience的流程,所以不会涉及一些更深的东西
之后ULyraExperienceManagerComponent简称为EMC
1 创建
完事开头难,首先找到了管理Experience的组件,那么它的初始化位置在哪?
其作为ALyraGameState的成员,在构造函数中用CreateDefaultSubobject创建。
cpp
//LyraGameState.h
private:
// Handles loading and managing the current gameplay experience
UPROPERTY()
TObjectPtr<ULyraExperienceManagerComponent>
ExperienceManagerComponent;
//LyraGameState.cpp
ALyraGameState::ALyraGameState(const FObjectInitializer& ObjectInitializer)
: Super(ObjectInitializer)
{
...
ExperienceManagerComponent = CreateDefaultSubobject<ULyraExperienceManagerComponent>(TEXT("ExperienceManagerComponent"));
...
}
2 加载
结合EMC中的这个枚举梳理,初始为Unloaded:
cpp
//LyraExperienceManagerComponent.h
ELyraExperienceLoadState LoadState = ELyraExperienceLoadState::Unloaded;
//其定义
enum class ELyraExperienceLoadState
{
Unloaded,
Loading,
LoadingGameFeatures,
LoadingChaosTestingDelay,
ExecutingActions,
Loaded,
Deactivating
};
结合之前的地图加载流程分析,加载的流程开始于ULyraExperienceManagerComponent::SetCurrentExperience->
ULyraExperienceManagerComponent::StartExperienceLoad中LoadState转为Loading ->
ULyraExperienceManagerComponent::OnExperienceLoadComplete中收集完所有的GameFeaturesToEnable后,LoadState 转为LoadingGameFeatures ->
对于每个GF,执行ULyraExperienceManager::NotifyOfPluginActivation和UGameFeaturesSubsystem::Get().LoadAndActivateGameFeaturePlugin->
先忽略测试用状态LoadingChaosTestingDelay
ULyraExperienceManagerComponent::OnExperienceFullLoadCompleted中状态转为ExecutingActions 并开始执行Actions,执行顺序为Experience本身Acitons中的每一个Action、遍历ActionSets,每一个ActionSets的Actions的每一个Action,对于单个Action,顺序执行OnGameFeatureRegistering()、OnGameFeatureLoading()、OnGameFeatureActivating(Context)->
Action执行完成后,状态进入Loaded,然后分别是OnExperienceLoaded三个优先级的多播
3 Deactivate
EndPlay触发DeActive->
DeActive涉及的GameFeature->
状态转为Deactivating ->
同理按顺序触发每个Action的OnGameFeatureDeactivating、OnGameFeatureUnregistering()->
状态转为Unloaded ,CurrentExperience = nullptr;
4 总结与图示