Skip to main content

Trigger Effects Manually

Type: Plugin/Engine only

This example uses a normal actor with both UEDInteractableComponent and UEDInteractionEffectsComponent, but triggers configured effects manually from code.

Example

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Data/EDInteractionTypes.h"
#include "MyMachineActor.generated.h"

class UArrowComponent;
class UEDInteractableComponent;
class UEDInteractionEffectsComponent;
class USceneComponent;
class UStaticMeshComponent;

UCLASS()
class AMyMachineActor : public AActor
{
GENERATED_BODY()

public:
AMyMachineActor();

UFUNCTION(BlueprintCallable)
void PlayDeniedFeedbackFor(const FEDInteractionEventContext& Context);

protected:
UPROPERTY(VisibleAnywhere)
TObjectPtr<USceneComponent> Root;

UPROPERTY(VisibleAnywhere)
TObjectPtr<UStaticMeshComponent> MachineMesh;

UPROPERTY(VisibleAnywhere)
TObjectPtr<USceneComponent> WidgetHolder;

UPROPERTY(VisibleAnywhere)
TObjectPtr<UArrowComponent> CenterArrow;

UPROPERTY(VisibleAnywhere)
TObjectPtr<UEDInteractableComponent> InteractableComponent;

UPROPERTY(VisibleAnywhere)
TObjectPtr<UEDInteractionEffectsComponent> InteractionEffectsComponent;
};
#include "MyMachineActor.h"

#include "Components/ArrowComponent.h"
#include "Components/EDInteractableComponent.h"
#include "Components/EDInteractionEffectsComponent.h"
#include "Components/SceneComponent.h"
#include "Components/StaticMeshComponent.h"

AMyMachineActor::AMyMachineActor()
{
Root = CreateDefaultSubobject<USceneComponent>(TEXT("Root"));
SetRootComponent(Root);

MachineMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MachineMesh"));
MachineMesh->SetupAttachment(Root);
MachineMesh->ComponentTags.Add(FName(TEXT("DimensionComponent")));

WidgetHolder = CreateDefaultSubobject<USceneComponent>(TEXT("WidgetHolder"));
WidgetHolder->SetupAttachment(Root);
WidgetHolder->ComponentTags.Add(FName(TEXT("WidgetHolderComponent")));

CenterArrow = CreateDefaultSubobject<UArrowComponent>(TEXT("CenterArrow"));
CenterArrow->SetupAttachment(MachineMesh);
CenterArrow->ComponentTags.Add(FName(TEXT("CenterComponent")));

InteractableComponent = CreateDefaultSubobject<UEDInteractableComponent>(TEXT("InteractableComponent"));
InteractionEffectsComponent = CreateDefaultSubobject<UEDInteractionEffectsComponent>(TEXT("InteractionEffectsComponent"));
}

void AMyMachineActor::PlayDeniedFeedbackFor(const FEDInteractionEventContext& Context)
{
if (!InteractionEffectsComponent)
{
return;
}

InteractionEffectsComponent->PlayConfiguredEffects(EEDInteractionEffectsEvent::InteractionDenied, Context);
}

Why this is useful

You can keep effect authoring inside the component, while deciding from code exactly when to play success, deny, or damage feedback.