오늘은 코딩을 배울수록 뇌가 포화되는 느낌이라 분명 기억 못할 것 같아 하나하나 정리했다. 이전부터 헤더 같은 것도 자세히 기록했었어야 했는데 미래의 나를 위해 남긴다.
※ 오늘 작업한 아래 코드에는 아이템 정보를 적다 말았다. 중간에 언리얼 에디터가 롤백 하는 바람에 그걸 먼저 복구하고 있었기 때문이다. 철야는 뇌 건강에 안좋다는 핑계를 대며 다음에 수정해서 적용하기로 했다.
CP_CraftingMenuWidget.cpp
#include "CP_CraftingMenuWidget.h"
#include "Components/TextBlock.h"
#include "Components/Button.h"
#include "Guns/CP_BarrelInfo.h"
#include "Guns/CP_TriggerInfo.h"
#include "Guns/CP_BodyInfo.h"
UCP_CraftingMenuWidget::UCP_CraftingMenuWidget(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
}
void UCP_CraftingMenuWidget::NativeConstruct()
{
Super::NativeConstruct();
if (BarrelButton1)
{
BarrelButton1->OnClicked.AddDynamic(this, &UCP_CraftingMenuWidget::OnBarrelButton1Clicked);
}
if (BarrelButton2)
{
BarrelButton2->OnClicked.AddDynamic(this, &UCP_CraftingMenuWidget::OnBarrelButton2Clicked);
}
if (BarrelButton3)
{
BarrelButton3->OnClicked.AddDynamic(this, &UCP_CraftingMenuWidget::OnBarrelButton3Clicked);
}
if (TriggerButton1)
{
TriggerButton1->OnClicked.AddDynamic(this, &UCP_CraftingMenuWidget::OnTriggerButton1Clicked);
}
if (TriggerButton2)
{
TriggerButton2->OnClicked.AddDynamic(this, &UCP_CraftingMenuWidget::OnTriggerButton2Clicked);
}
if (TriggerButton3)
{
TriggerButton3->OnClicked.AddDynamic(this, &UCP_CraftingMenuWidget::OnTriggerButton3Clicked);
}
if (BodyButton1)
{
BodyButton1->OnClicked.AddDynamic(this, &UCP_CraftingMenuWidget::OnBodyButton1Clicked);
}
if (BodyButton2)
{
BodyButton2->OnClicked.AddDynamic(this, &UCP_CraftingMenuWidget::OnBodyButton2Clicked);
}
if (BodyButton3)
{
BodyButton3->OnClicked.AddDynamic(this, &UCP_CraftingMenuWidget::OnBodyButton3Clicked);
}
}
void UCP_CraftingMenuWidget::OnBarrelButton1Clicked()
{
FString Name = TEXT("BarrelBeam");
FString Description = TEXT("This is the first barrel of the gun.");
// 실제 CP_BarrelInfo에서 정보필요
// Name = CP_BarrelInfo::GetName(1);
// Description = CP_BarrelInfo::GetDescription(1);
UpdateItemInfo(Name, Description);
}
void UCP_CraftingMenuWidget::OnBarrelButton2Clicked()
{
FString Name = TEXT("BarrelBeamScatter");
FString Description = TEXT("This is the second barrel of the gun.");
// 실제 CP_BarrelInfo에서 정보필요
// Name = CP_BarrelInfo::GetName(2);
// Description = CP_BarrelInfo::GetDescription(2);
UpdateItemInfo(Name, Description);
}
void UCP_CraftingMenuWidget::OnBarrelButton3Clicked()
{
FString Name = TEXT("BarrelBulletScatter");
FString Description = TEXT("This is the third barrel of the gun.");
// 실제 CP_BarrelInfo에서 정보필요
// Name = CP_BarrelInfo::GetName(3);
// Description = CP_BarrelInfo::GetDescription(3);
UpdateItemInfo(Name, Description);
}
void UCP_CraftingMenuWidget::OnTriggerButton1Clicked()
{
FString Name = TEXT("Trigger 1");
FString Description = TEXT("This is the first trigger of the gun.");
// 실제 CP_TriggerInfo에서 정보필요
// Name = CP_TriggerInfo::GetName(1);
// Description = CP_TriggerInfo::GetDescription(1);
UpdateItemInfo(Name, Description);
}
void UCP_CraftingMenuWidget::OnTriggerButton2Clicked()
{
FString Name = TEXT("Trigger 2");
FString Description = TEXT("This is the second trigger of the gun.");
// 실제 CP_TriggerInfo에서 정보필요
// Name = CP_TriggerInfo::GetName(2);
// Description = CP_TriggerInfo::GetDescription(2);
UpdateItemInfo(Name, Description);
}
void UCP_CraftingMenuWidget::OnTriggerButton3Clicked()
{
FString Name = TEXT("Trigger 3");
FString Description = TEXT("This is the third trigger of the gun.");
// 실제 CP_TriggerInfo에서 정보필요
// Name = CP_TriggerInfo::GetName(3);
// Description = CP_TriggerInfo::GetDescription(3);
UpdateItemInfo(Name, Description);
}
void UCP_CraftingMenuWidget::OnBodyButton1Clicked()
{
FString Name = TEXT("Body 1");
FString Description = TEXT("This is the first body of the gun.");
// 실제 CP_BodyInfo에서 정보필요
// Name = CP_BodyInfo::GetName(1);
// Description = CP_BodyInfo::GetDescription(1);
UpdateItemInfo(Name, Description);
}
void UCP_CraftingMenuWidget::OnBodyButton2Clicked()
{
FString Name = TEXT("Body 2");
FString Description = TEXT("This is the second body of the gun.");
// 실제 CP_BodyInfo에서 정보필요
// Name = CP_BodyInfo::GetName(2);
// Description = CP_BodyInfo::GetDescription(2);
UpdateItemInfo(Name, Description);
}
void UCP_CraftingMenuWidget::OnBodyButton3Clicked()
{
FString Name = TEXT("Body 3");
FString Description = TEXT("This is the third body of the gun.");
// 실제 CP_BodyInfo에서 정보필요
// Name = CP_BodyInfo::GetName(3);
// Description = CP_BodyInfo::GetDescription(3);
UpdateItemInfo(Name, Description);
}
void UCP_CraftingMenuWidget::UpdateItemInfo(const FString& Name, const FString& Description)
{
if (ItemName)
{
ItemName->SetText(FText::FromString(Name));
}
if (ItemDescription)
{
ItemDescription->SetText(FText::FromString(Description));
}
}
#include "CP_CraftingMenuWidget.h": 크래프팅 메뉴 위젯의 헤더 파일을 포함한다.#include "Components/TextBlock.h": 텍스트 블록 컴포넌트를 사용하기 위해 포함한다.#include "Components/Button.h": 버튼 컴포넌트를 사용하기 위해 포함한다.#include "Guns/CP_BarrelInfo.h": 배럴 정보를 가져오기 위한 헤더를 포함한다.#include "Guns/CP_TriggerInfo.h": 트리거 정보를 가져오기 위한 헤더를 포함한다.#include "Guns/CP_BodyInfo.h": 바디 정보를 가져오기 위한 헤더를 포함한다.const FObjectInitializer& ObjectInitializer: 객체 초기화를 위한 파라미터를 받는다.Super(ObjectInitializer): 부모 클래스의 생성자를 호출한다.BarrelButton1, BarrelButton2, BarrelButton3: 배럴 선택 버튼에 각각 OnBarrelButton1Clicked, OnBarrelButton2Clicked, OnBarrelButton3Clicked 함수를 연결한다.TriggerButton1, TriggerButton2, TriggerButton3: 트리거 선택 버튼에 각각 OnTriggerButton1Clicked, OnTriggerButton2Clicked, OnTriggerButton3Clicked 함수를 연결한다.BodyButton1, BodyButton2, BodyButton3: 바디 선택 버튼에 각각 OnBodyButton1Clicked, OnBodyButton2Clicked, OnBodyButton3Clicked 함수를 연결한다.Super::NativeConstruct(): 부모 클래스의 NativeConstruct를 호출한다.FString Name = TEXT("BarrelBeam"): 배럴 이름을 "BarrelBeam"으로 설정한다.FString Description = TEXT("This is the first barrel of the gun."): 배럴 설명을 설정한다.UpdateItemInfo(Name, Description): 설정된 이름과 설명으로 UI를 업데이트한다.FString Name = TEXT("BarrelBeamScatter"): 배럴 이름을 "BarrelBeamScatter"로 설정한다.FString Description = TEXT("This is the second barrel of the gun."): 배럴 설명을 설정한다.UpdateItemInfo(Name, Description): 설정된 이름과 설명으로 UI를 업데이트한다.FString Name = TEXT("BarrelBulletScatter"): 배럴 이름을 "BarrelBulletScatter"로 설정한다.FString Description = TEXT("This is the third barrel of the gun."): 배럴 설명을 설정한다.UpdateItemInfo(Name, Description): 설정된 이름과 설명으로 UI를 업데이트한다.FString Name = TEXT("Trigger 1"): 트리거 이름을 "Trigger 1"로 설정한다.FString Description = TEXT("This is the first trigger of the gun."): 트리거 설명을 설정한다.UpdateItemInfo(Name, Description): 설정된 이름과 설명으로 UI를 업데이트한다.FString Name = TEXT("Trigger 2"): 트리거 이름을 "Trigger 2"로 설정한다.FString Description = TEXT("This is the second trigger of the gun."): 트리거 설명을 설정한다.UpdateItemInfo(Name, Description): 설정된 이름과 설명으로 UI를 업데이트한다.FString Name = TEXT("Trigger 3"): 트리거 이름을 "Trigger 3"으로 설정한다.FString Description = TEXT("This is the third trigger of the gun."): 트리거 설명을 설정한다.UpdateItemInfo(Name, Description): 설정된 이름과 설명으로 UI를 업데이트한다.FString Name = TEXT("Body 1"): 바디 이름을 "Body 1"로 설정한다.FString Description = TEXT("This is the first body of the gun."): 바디 설명을 설정한다.UpdateItemInfo(Name, Description): 설정된 이름과 설명으로 UI를 업데이트한다.FString Name = TEXT("Body 2"): 바디 이름을 "Body 2"로 설정한다.FString Description = TEXT("This is the second body of the gun."): 바디 설명을 설정한다.UpdateItemInfo(Name, Description): 설정된 이름과 설명으로 UI를 업데이트한다.FString Name = TEXT("Body 3"): 바디 이름을 "Body 3"으로 설정한다.FString Description = TEXT("This is the third body of the gun."): 바디 설명을 설정한다.UpdateItemInfo(Name, Description): 설정된 이름과 설명으로 UI를 업데이트한다.const FString& Name: 부품의 이름을 받는다.const FString& Description: 부품의 설명을 받는다.ItemName->SetText(FText::FromString(Name)): ItemName 텍스트 블록에 부품 이름을 설정한다.ItemDescription->SetText(FText::FromString(Description)): ItemDescription 텍스트 블록에 부품 설명을 설정한다.BarrelButton1, BarrelButton2, BarrelButton3: 배럴 선택을 위한 버튼들이다.TriggerButton1, TriggerButton2, TriggerButton3: 트리거 선택을 위한 버튼들이다.BodyButton1, BodyButton2, BodyButton3: 바디 선택을 위한 버튼들이다.ItemName: 선택된 부품의 이름을 표시하는 텍스트 블록이다.ItemDescription: 선택된 부품의 설명을 표시하는 텍스트 블록이다.#pragma once
#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "Components/Button.h"
#include "Components/TextBlock.h"
#include "CP_CraftingMenuWidget.generated.h"
UCLASS()
class CYBERPUNK_API UCP_CraftingMenuWidget : public UUserWidget
{
GENERATED_BODY()
public:
UCP_CraftingMenuWidget(const FObjectInitializer& ObjectInitializer);
protected:
virtual void NativeConstruct() override;
// UMG 위젯 바인딩
UPROPERTY(meta = (BindWidget))
UButton* BarrelButton1;
UPROPERTY(meta = (BindWidget))
UButton* BarrelButton2;
UPROPERTY(meta = (BindWidget))
UButton* BarrelButton3;
UPROPERTY(meta = (BindWidget))
UButton* TriggerButton1;
UPROPERTY(meta = (BindWidget))
UButton* TriggerButton2;
UPROPERTY(meta = (BindWidget))
UButton* TriggerButton3;
UPROPERTY(meta = (BindWidget))
UButton* BodyButton1;
UPROPERTY(meta = (BindWidget))
UButton* BodyButton2;
UPROPERTY(meta = (BindWidget))
UButton* BodyButton3;
UPROPERTY(meta = (BindWidget))
UTextBlock* ItemName;
UPROPERTY(meta = (BindWidget))
UTextBlock* ItemDescription;
private:
UFUNCTION()
void OnBarrelButton1Clicked();
UFUNCTION()
void OnBarrelButton2Clicked();
UFUNCTION()
void OnBarrelButton3Clicked();
UFUNCTION()
void OnTriggerButton1Clicked();
UFUNCTION()
void OnTriggerButton2Clicked();
UFUNCTION()
void OnTriggerButton3Clicked();
UFUNCTION()
void OnBodyButton1Clicked();
UFUNCTION()
void OnBodyButton2Clicked();
UFUNCTION()
void OnBodyButton3Clicked();
void UpdateItemInfo(const FString& Name, const FString& Description);
};
본래라면 더 효율적인 코딩 방법이 있을 것 같은데, 채점은 미래의 나에게 맡기기로 했다.