diff --git a/Source/WidgetInteraction/Private/WidgetInteraction.cpp b/Source/WidgetInteraction/Private/WidgetInteraction.cpp index 7d9f0a8cec205d8a6bfb5a29e6e6f2ba38710913..e32861755bd47259851e0ac05fd23382b4716c7c 100644 --- a/Source/WidgetInteraction/Private/WidgetInteraction.cpp +++ b/Source/WidgetInteraction/Private/WidgetInteraction.cpp @@ -21,20 +21,26 @@ void FWidgetInteractionModule::ShutdownModule() void FWidgetInteractionModule::OnWorldTickStart(ELevelTick level_tick, float val) { + //called every Tick() + auto worlds = GEngine->GetWorldContexts(); - if (widget_interaction_cmp_ != nullptr) { - if (widget_interaction_cmp_->IsValidLowLevel() == true) { - return; - } - else { - widget_interaction_cmp_ = nullptr; - } - } + for (auto world_context : worlds) { - for (auto & world_context : worlds) - { auto world = world_context.World(); + + if (last_world == world && widget_interaction_cmp_ != nullptr) { + if (widget_interaction_cmp_->IsValidLowLevel() == true) { + continue; + } + else { + widget_interaction_cmp_ = nullptr; + } + } + + if (world == nullptr) + continue; + auto player_controller = world->GetFirstPlayerController(); if (player_controller == nullptr) continue; @@ -43,6 +49,8 @@ void FWidgetInteractionModule::OnWorldTickStart(ELevelTick level_tick, float val if (vr_pawn == nullptr) continue; + UE_LOG(LogTemp, Warning, TEXT("OnWorldTickStart called and interaction component will be updated")); + FString name = ""; UClass* component_class = UMotionControllerComponent::StaticClass(); @@ -67,17 +75,18 @@ void FWidgetInteractionModule::OnWorldTickStart(ELevelTick level_tick, float val } auto parent_vec = vr_pawn->GetComponentsByClass(component_class); - bool success; - for (auto parent : parent_vec) - if (parent->GetName() == FString(name)) - { - CreateWidgetInteraction(dynamic_cast<USceneComponent*>(parent), vr_pawn); - success = true; - } - if(!success) - UE_LOG(LogTemp, Error, TEXT("Failed to load widget asset \"%s"), *name); - } + bool success; + for (auto parent : parent_vec) { + if (parent->GetName() == FString(name)) { + CreateWidgetInteraction(dynamic_cast<USceneComponent*>(parent), vr_pawn); + success = true; + last_world = world; + } + } + if (!success) + UE_LOG(LogTemp, Error, TEXT("Failed to load widget asset \"%s"), *name); + } } void FWidgetInteractionModule::CreateWidgetInteraction(USceneComponent * parent, AVirtualRealityPawn* outer) diff --git a/Source/WidgetInteraction/Public/WidgetInteraction.h b/Source/WidgetInteraction/Public/WidgetInteraction.h index 6a604d6c478de69a52eac7537237356cc2bd3ca4..747a3bdc6f3a7f13ef4471bdbf077864b0d2001d 100644 --- a/Source/WidgetInteraction/Public/WidgetInteraction.h +++ b/Source/WidgetInteraction/Public/WidgetInteraction.h @@ -25,4 +25,5 @@ private: TBaseDelegate<void, ELevelTick, float> on_world_tick_start_delegate_; URwthComponent * widget_interaction_cmp_; + UWorld* last_world; };