I would put most of the logic into your “Portal” blueprint.
You don’t want to use GetOverlappingActors
, because that would give you overlapping actors only for that frame. To constantly check it on every single tick would be really expensive!
Instead, setup a trigger box and catch OnOverlapBegin
and OnOverlapEnd
events. This can be using this code
//Constructor
// Create a CollisionBox component named TriggerComp
//BeginPlay
TriggerComp->OnComponentBeginOverlap.AddDynamic(this, &AMyActor::OnTriggerBeginOverlap);
TriggerComp->OnComponentBeginOverlap.AddDynamic(this, &AMyActor::OnTriggerEndOverlap);
void AMyActor::OnTriggerBeginOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
// Cast OtherActor to your Player character and show UMG
}
void AMyActor::OnTriggerEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)
{
// Stop showing UMG
}
You can even pass the LevelName to UMG in the overlap!
Good luck!