Skip to main content

Give Item To Player

Type: Requires external gameplay system

This is a full interactable actor example that grants an item to the interacting player if your inventory system accepts it.

#pragma once

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

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

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

public:
AMyLootPickupActor();

protected:
virtual void BeginPlay() override;

UPROPERTY(VisibleAnywhere)
TObjectPtr<USceneComponent> Root;

UPROPERTY(VisibleAnywhere)
TObjectPtr<UStaticMeshComponent> VisualMesh;

UPROPERTY(VisibleAnywhere)
TObjectPtr<USceneComponent> WidgetHolder;

UPROPERTY(VisibleAnywhere)
TObjectPtr<UArrowComponent> CenterArrow;

UPROPERTY(VisibleAnywhere)
TObjectPtr<UEDInteractableComponent> InteractableComponent;

UPROPERTY(EditAnywhere, Category = "Loot")
FName ItemId = TEXT("Potion.Small");

UPROPERTY(EditAnywhere, Category = "Loot")
int32 ItemAmount = 1;

UFUNCTION()
void HandleTaken(const FEDInteractionEventContext& Context);
};

Source

#include "MyLootPickupActor.h"

#include "Components/ArrowComponent.h"
#include "Components/EDInteractableComponent.h"
#include "Components/SceneComponent.h"
#include "Components/StaticMeshComponent.h"
#include "GameFramework/Pawn.h"

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

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

WidgetHolder = CreateDefaultSubobject<USceneComponent>(TEXT("WidgetHolder"));
WidgetHolder->SetupAttachment(Root);
WidgetHolder->SetRelativeLocation(FVector(0.f, 0.f, 80.f));
WidgetHolder->ComponentTags.Add(FName(TEXT("WidgetHolderComponent")));

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

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

void AMyLootPickupActor::BeginPlay()
{
Super::BeginPlay();

InteractableComponent->OnInteractionSuccessful.AddDynamic(this, &AMyLootPickupActor::HandleTaken);
}

void AMyLootPickupActor::HandleTaken(const FEDInteractionEventContext& Context)
{
APawn* InstigatorPawn = Context.Instigator ? Context.Instigator->GetPawn() : nullptr;
if (!InstigatorPawn)
{
return;
}

// Placeholder: your own inventory system. This is not part of Unreal or EDInteractionSystem.
UMyInventoryComponent* Inventory = InstigatorPawn->FindComponentByClass<UMyInventoryComponent>();
if (!Inventory)
{
return;
}

const bool bAdded = Inventory->AddItemById(ItemId, ItemAmount);
if (!bAdded)
{
return;
}

Destroy();
}

External dependency note

UMyInventoryComponent and AddItemById(...) are placeholders for your own inventory framework.

  • Destroy the pickup only after the inventory confirms success.
  • If the inventory is full, keep the actor alive and optionally play deny feedback.