이번 글에서는 ABase_Item
을 상속받은 KeyActor
를 월드에 배치했을 때, 자동으로 ItemID
값을 설정해주는 방법을 소개합니다. 이를 위해 Editor Utility Widget을 사용하여 월드에 배치된 아이템의 ItemID
값을 자동으로 설정할 수 있습니다. 이렇게 하면 직접 ItemID
값을 입력하지 않아도 되며, 일관성 있게 ItemID
를 관리할 수 있습니다.
ABase_Item
클래스 정의KeyActor
클래스 정의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
};
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
};
Editor Utilities
> Editor Utility Widget
을 선택합니다.Editor Utility Widget
을 생성하고 적절한 이름을 지정합니다. 예를 들어, BP_SetItemIDUtility
라고 만든다고 해봅시다.BP_SetItemIDUtility
를 더블 클릭하여 열고, 블루프린트 에디터로 들어갑니다.Designer
탭에서 버튼을 추가하고, 적절한 이름을 지정합니다. 예: "Set Item IDs"Details
패널에서 OnClicked
이벤트를 추가합니다.다음은 예제 블루프린트 스크립트입니다. 월드에 배치된 모든 아이템을 찾아 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
}
Blueprint Editor Utility Widget
을 저장하고 닫습니다.Editor Utilities
> Blueprint Editor Utility Widget
을 선택하여 생성한 BP_SetItemIDUtility
위젯을 실행합니다.ItemID
를 자동으로 설정합니다.이제 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
를 자동으로 설정함으로써 수작업을 줄이고 일관성 있게 아이템을 관리할 수 있습니다.