目錄
- 前言
- 1 創建
- 2 加載
- 3 Deactivate
- 4 總結與圖示
前言
這篇主要將視角放在Experience的流程,所以不會涉及一些更深的東西
之后ULyraExperienceManagerComponent簡稱為EMC
1 創建
完事開頭難,首先找到了管理Experience的組件,那么它的初始化位置在哪?
其作為ALyraGameState的成員,在構造函數中用CreateDefaultSubobject創建。
//LyraGameState.h
private:// Handles loading and managing the current gameplay experienceUPROPERTY()TObjectPtr<ULyraExperienceManagerComponent>ExperienceManagerComponent;//LyraGameState.cpp
ALyraGameState::ALyraGameState(const FObjectInitializer& ObjectInitializer): Super(ObjectInitializer)
{...ExperienceManagerComponent = CreateDefaultSubobject<ULyraExperienceManagerComponent>(TEXT("ExperienceManagerComponent"));...
}
2 加載
結合EMC中的這個枚舉梳理,初始為Unloaded:
//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 總結與圖示