Open Door Or Toggle State
Type: Plugin/Engine only
This example shows a normal door actor with a mesh, focus points, and an interactable component.
Example
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Data/EDInteractionTypes.h"
#include "MyDoorActor.generated.h"
class UArrowComponent;
class UEDInteractableComponent;
class USceneComponent;
class UStaticMeshComponent;
UCLASS()
class AMyDoorActor : public AActor
{
GENERATED_BODY()
public:
AMyDoorActor();
protected:
virtual void BeginPlay() override;
UPROPERTY(VisibleAnywhere)
TObjectPtr<USceneComponent> Root;
UPROPERTY(VisibleAnywhere)
TObjectPtr<UStaticMeshComponent> DoorMesh;
UPROPERTY(VisibleAnywhere)
TObjectPtr<USceneComponent> WidgetHolder;
UPROPERTY(VisibleAnywhere)
TObjectPtr<UArrowComponent> CenterArrow;
UPROPERTY(VisibleAnywhere)
TObjectPtr<UEDInteractableComponent> InteractableComponent;
UPROPERTY(EditAnywhere, Category = "Door")
bool bIsOpen = false;
UFUNCTION()
void HandleOpenDoor(const FEDInteractionEventContext& Context);
};
#include "MyDoorActor.h"
#include "Components/ArrowComponent.h"
#include "Components/EDInteractableComponent.h"
#include "Components/SceneComponent.h"
#include "Components/StaticMeshComponent.h"
AMyDoorActor::AMyDoorActor()
{
Root = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
SetRootComponent(Root);
DoorMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DoorMesh"));
DoorMesh->SetupAttachment(Root);
DoorMesh->ComponentTags.Add(FName(TEXT("DimensionComponent")));
WidgetHolder = CreateDefaultSubobject<USceneComponent>(TEXT("WidgetHolder"));
WidgetHolder->SetupAttachment(Root);
WidgetHolder->SetRelativeLocation(FVector(0.f, 0.f, 90.f));
WidgetHolder->ComponentTags.Add(FName(TEXT("WidgetHolderComponent")));
CenterArrow = CreateDefaultSubobject<UArrowComponent>(TEXT("CenterArrow"));
CenterArrow->SetupAttachment(DoorMesh);
CenterArrow->ComponentTags.Add(FName(TEXT("CenterComponent")));
InteractableComponent = CreateDefaultSubobject<UEDInteractableComponent>(TEXT("InteractableComponent"));
}
void AMyDoorActor::BeginPlay()
{
Super::BeginPlay();
InteractableComponent->OnInteractionSuccessful.AddDynamic(this, &AMyDoorActor::HandleOpenDoor);
}
void AMyDoorActor::HandleOpenDoor(const FEDInteractionEventContext& Context)
{
if (bIsOpen)
{
return;
}
bIsOpen = true;
DoorMesh->SetRelativeRotation(FRotator(0.f, 90.f, 0.f));
InteractableComponent->SetCooldownSecondsServer(1.5f);
}
Notes
- The example uses a direct transform change to stay self-contained.
- In a real game you may replace that with a timeline, animation, or replicated state machine.