던전이 진행하면서 던전의 현 진행도를 나타내는 위젯을 만들어보겠습니다
던전의 진행도는 AI가 잡은 마리수에 비례하여 0 부터 100% 비율을 나타냅니다
둥근 메테리얼을 만들고 메테리얼 인스턴스를 만듭니다
Percentage라는 ScalarParameter값을 코드에서 수정해보겠습니다
c++에서 scalarParameter값을 수정하기위해서는 build.cs의 파일의 수정이 필요합니다
Build.cs파일에 해당 모듈을 추가해줍니다
"Slate", "SlateCore"
먼저 위젯을 띄우겠습니다
UPROPERTY(EditAnywhere, Category = "Percent")
TSubclassOf<UDungeonClearPercentWidget> percentWidgetAsset;
class UDungeonClearPercentWidget* percentWidget;
UFUNCTION()
void SetPercentWidget();
해당함수는 뷰포트에 TsubclassOf로 참조한 percentWidgetAsset을 띄웁니다
void ASwordPlayerGameBase::SetPercentWidget()
{
ASwordPlayController* swordController = Cast<ASwordPlayController>(GetWorld()->GetFirstPlayerController());
if (swordController)
{
percentWidget = CreateWidget<UDungeonClearPercentWidget>(swordController, percentWidgetAsset);
percentWidget->AddToViewport();
}
}
위젯에서 사용할 인스턴스를 할당해주고 위젯의 이미지이름 변수와 코드를 바인드해줍니다
위젯의 코드입니다
.h
UCLASS()
class BLASTERDREAM_API UDungeonClearPercentWidget : public UUserWidget
{
GENERATED_BODY()
public:
virtual void NativeConstruct() override;
void setPercent(float percent);
UPROPERTY(meta = (BindWidget))
UImage* Image_PercentCircle;
UPROPERTY()
UMaterialInstanceDynamic* dynamicMaterial;
};
사용할 헤더를 추가해줍니다
#include "Components/Image.h"
#include "Materials/MaterialInstanceDynamic.h"
ScalarParameter인 Percentage의 퍼센트를 바꾸는 함수입니다
처음에는 0프로 로 초기화시킵니다 setPercent(float percent) 함수로 퍼센트를 업데이트시킵니다
void UDungeonClearPercentWidget::NativeConstruct()
{
Super::NativeConstruct();
UMaterialInterface* materialInstance = Cast<UMaterialInterface>(Image_PercentCircle->GetBrush().GetResourceObject());
if (materialInstance)
{
dynamicMaterial = UMaterialInstanceDynamic::Create(materialInstance, this);
if (dynamicMaterial)
{
FSlateBrush newBrush = Image_PercentCircle->GetBrush();
newBrush.SetResourceObject(dynamicMaterial);
Image_PercentCircle->SetBrush(newBrush);
dynamicMaterial->SetScalarParameterValue(FName("Percentage"), 0.0f);
}
}
}
void UDungeonClearPercentWidget::setPercent(float percent)
{
if (dynamicMaterial)
{
dynamicMaterial->SetScalarParameterValue(FName("Percentage"), percent);
}
}
던전1부터 3까지 경유하면서 스폰되는 AI의 수는 123마리입니다
게임인스턴스에서 총 잡은 카운트를 세고있습니다 인스턴스의 skeletonDieSumCount변수입니다
게임모드에서 작업합니다
BeginPlay에서 캐스팅을 해줍니다
UStatGameInstance* myInstance;
class UDungeonClearPercentWidget* percentWidget;
myInstance = Cast<UStatGameInstance>(GetGameInstance());
percentWidget = Cast<UDungeonClearPercentWidget>(percentWidget);
tick에서 인스턴스의 총 잡은 카운트와 총잡아야할 카운트(123마리)를 퍼센트로 계산하여 위젯에 할당합니다
Clamp값을 주어 넘치지않게 해줍니다 Max는 1입니다
if (myInstance)
{
float killCount = myInstance->skeletonDieSumCount;
float nowPercent = killCount / 123.0f;
nowPercent = FMath::Clamp(nowPercent, 0.0f, 1.0f);
percentWidget->setPercent(nowPercent);
}
총 처치된 ai수 카운트퍼센트에 따라 좌측상단에있는 메테리얼의 ScalarParameter값이 변경되어 fill값이 변경됩니다
던전진행도를 숫자로도 나타내보겠습니다
텍스트를 달아줍니다
percent인 float값을 int형으로 바꾼뒤 그걸 string으로 형변환 그리고 뒤에 %를 붙히는 함수를 만들었습니다
void UDungeonClearPercentWidget::setTextPercent(float percent)
{
int32 intPercent = FMath::RoundToInt(percent * 100.0f);
FString percentString = FString::Printf(TEXT("%d%%"), intPercent);
TextBlock_Percent->SetText(FText::FromString(percentString));
}
'Unreal5 프로젝트 다이어리' 카테고리의 다른 글
Unreal - 던전 클리어 위젯 만들기 (0) | 2025.05.25 |
---|---|
Unreal - 플레이어 리스폰 (0) | 2025.05.24 |
Unreal - 자동 흡수되는 확률형 드롭 아이템 만들기 (0) | 2025.05.22 |
Unrela - 시퀀스 만들기 (AI편) (0) | 2025.05.22 |
Unreal - 부숴지는 벽 만들기 (Chaos Distruction) (0) | 2025.05.22 |