// Copyright Epic Games, Inc. All Rights Reserved. #pragma once #include "Delegates/Delegate.h" #include "Kismet/BlueprintAsyncActionBase.h" #include "UObject/Object.h" #include "UObject/UObjectGlobals.h" #include "UObject/WeakObjectPtrTemplates.h" #include "AsyncAction_ExperienceReady.generated.h" class AGameStateBase; class ULyraExperienceDefinition; class UWorld; struct FFrame; DECLARE_DYNAMIC_MULTICAST_DELEGATE(FExperienceReadyAsyncDelegate); /** * Asynchronously waits for the game state to be ready and valid and then calls the OnReady event. Will call OnReady * immediately if the game state is valid already. */ UCLASS() class UAsyncAction_ExperienceReady : public UBlueprintAsyncActionBase { GENERATED_UCLASS_BODY() public: // Waits for the experience to be determined and loaded UFUNCTION(BlueprintCallable, meta=(WorldContext = "WorldContextObject", BlueprintInternalUseOnly="true")) static UAsyncAction_ExperienceReady* WaitForExperienceReady(UObject* WorldContextObject); virtual void Activate() override; public: // Called when the experience has been determined and is ready/loaded UPROPERTY(BlueprintAssignable) FExperienceReadyAsyncDelegate OnReady; private: void Step1_HandleGameStateSet(AGameStateBase* GameState); void Step2_ListenToExperienceLoading(AGameStateBase* GameState); void Step3_HandleExperienceLoaded(const ULyraExperienceDefinition* CurrentExperience); void Step4_BroadcastReady(); TWeakObjectPtr WorldPtr; };