[UE5] Editor Utility Widget을 활용한 자동 ItemID 설정

ChangJin·2024년 7월 12일
0

Unreal Engine5

목록 보기
80/114
post-thumbnail

이번 글에서는 ABase_Item을 상속받은 KeyActor를 월드에 배치했을 때, 자동으로 ItemID 값을 설정해주는 방법을 소개합니다. 이를 위해 Editor Utility Widget을 사용하여 월드에 배치된 아이템의 ItemID 값을 자동으로 설정할 수 있습니다. 이렇게 하면 직접 ItemID 값을 입력하지 않아도 되며, 일관성 있게 ItemID를 관리할 수 있습니다.


전체 과정

  • ABase_Item 클래스 정의
  • KeyActor 클래스 정의
  • Editor Utility Widget 생성 및 설정
  • 블루프린트 스크립트 작성
  • Editor Utility Widget 실행
  • 인벤토리에 아이템 추가

1. ABase_Item 클래스 정의

먼저 ABase_Item 클래스를 정의합니다. 이 클래스는 모든 아이템의 기본 클래스로 사용됩니다.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Base_Item.generated.h"

UCLASS()
class MYGAME_API ABase_Item : public AActor
{
    GENERATED_BODY()
    
public:    
    ABase_Item();

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Item")
    FString ItemID;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Item")
    FString ItemName;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Item")
    int32 Quantity;

    // Additional item properties
};

2. KeyActor 클래스 정의

ABase_Item을 상속받은 KeyActor 클래스를 정의합니다. 이 클래스는 특정 아이템 타입을 나타냅니다.

#pragma once

#include "CoreMinimal.h"
#include "Base_Item.h"
#include "KeyActor.generated.h"

UCLASS()
class MYGAME_API AKeyActor : public ABase_Item
{
    GENERATED_BODY()
    
public:
    AKeyActor();

    // Additional properties specific to KeyActor
};

3. Editor Utility Widget 생성 및 설정

  1. 콘텐츠 브라우저에서 우클릭하여 Editor Utilities > Editor Utility Widget을 선택합니다.
  2. Editor Utility Widget을 생성하고 적절한 이름을 지정합니다. 예를 들어, BP_SetItemIDUtility라고 만든다고 해봅시다.
  3. 생성한 BP_SetItemIDUtility를 더블 클릭하여 열고, 블루프린트 에디터로 들어갑니다.
  4. Designer 탭에서 버튼을 추가하고, 적절한 이름을 지정합니다. 예: "Set Item IDs"
  5. 버튼을 선택하고 Details 패널에서 OnClicked 이벤트를 추가합니다.

4. 블루프린트 스크립트 작성

다음은 예제 블루프린트 스크립트입니다. 월드에 배치된 모든 아이템을 찾아 ItemID를 자동으로 설정하도록 합니다.

// BP_SetItemIDUtility.h
#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "BP_SetItemIDUtility.generated.h"

UCLASS()
class MYGAME_API UBP_SetItemIDUtility : public UUserWidget
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintCallable, Category="ItemID")
    void SetItemIDs();

private:
    FString GenerateItemID(AActor* Item);
};
// BP_SetItemIDUtility.cpp
#include "BP_SetItemIDUtility.h"
#include "Base_Item.h"
#include "Engine/World.h"
#include "EngineUtils.h"
#include "Kismet/GameplayStatics.h"
#include "Kismet/KismetSystemLibrary.h"

void UBP_SetItemIDUtility::SetItemIDs()
{
    // Find all ABase_Item actors in the world
    for (TActorIterator<ABase_Item> It(GetWorld()); It; ++It)
    {
        ABase_Item* Item = *It;
        if (Item)
        {
            // Automatically set the ItemID based on some logic
            FString NewItemID = GenerateItemID(Item);
            Item->ItemID = NewItemID;

            // Optionally, log the changes
            UE_LOG(LogTemp, Warning, TEXT("Set ItemID for %s to %s"), *Item->GetName(), *NewItemID);
        }
    }

    // Optionally, notify the user that the operation is complete
    UKismetSystemLibrary::PrintString(this, TEXT("Item IDs have been set!"));
}

FString UBP_SetItemIDUtility::GenerateItemID(AActor* Item)
{
    // Generate a new ItemID based on the actor's properties
    // For example, you could use the actor's name, location, etc.
    return Item->GetName(); // Simplified example
}

5. Editor Utility Widget 실행

  1. Blueprint Editor Utility Widget을 저장하고 닫습니다.
  2. 에디터 상단 메뉴에서 Editor Utilities > Blueprint Editor Utility Widget을 선택하여 생성한 BP_SetItemIDUtility 위젯을 실행합니다.
  3. 위젯이 열리면 "Set Item IDs" 버튼을 클릭하여 월드에 배치된 모든 아이템의 ItemID를 자동으로 설정합니다.

6. 인벤토리에 아이템 추가

이제 Base_Item 클래스를 기반으로 월드에 배치된 아이템을 캐릭터가 주웠을 때 ItemID가 자동으로 설정되고 인벤토리에 추가됩니다.

// Base_Character.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "Base_Item.h"
#include "Base_Character.generated.h"

UCLASS()
class MYGAME_API ABase_Character : public ACharacter
{
    GENERATED_BODY()

public:
    ABase_Character();

protected:
    virtual void BeginPlay() override;

public:    
    virtual void Tick(float DeltaTime) override;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Inventory")
    TArray<FInventoryItem> Inventory;

    UFUNCTION(BlueprintCallable, Category="Inventory")
    void PickupItem(AActor* ItemActor);

    UFUNCTION(BlueprintCallable, Category="Inventory")
    void AddItemToInventory(const FInventoryItem& Item);
};
// Base_Character.cpp
#include "Base_Character.h"

ABase_Character::ABase_Character()
{
    PrimaryActorTick.bCanEverTick = true;
}

void ABase_Character::BeginPlay()
{
    Super::BeginPlay();
}

void ABase_Character::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}

void ABase_Character::PickupItem(AActor* ItemActor)
{
    ABase_Item* Item = Cast<ABase_Item>(ItemActor);
    if (Item)
    {
        FInventoryItem InventoryItem;
        InventoryItem.ItemID = Item->ItemID;
        InventoryItem.ItemName = Item->ItemName;
        InventoryItem.Quantity = Item->Quantity;

        AddItemToInventory(InventoryItem);

        // Optionally, destroy the item actor
        ItemActor->Destroy();
    }
}

void ABase_Character::AddItemToInventory(const FInventoryItem& Item)
{
    Inventory.Add(Item);
}

결론

Base_Item을 상속받은 KeyActor와 같은 아이템을 월드에 배치할 때 ItemID를 자동으로 설정하고, 캐릭터가 주웠을 때 인벤토리에 추가할 수 있습니다. Editor Utility Widget을 사용하여 아이템의 ItemID를 자동으로 설정함으로써 수작업을 줄이고 일관성 있게 아이템을 관리할 수 있습니다.


참고 자료


profile
게임 프로그래머

0개의 댓글