728x90
반응형
위젯디자인을 마치고 코드와 블루프린트를 활용하여 바인딩 시키는 작업을 완료함
컨트롤러헤더파일에 위젯클래스를 선언해준뒤 cpp파일의 beginplay함수에서 다음과 같이 구현
void AMainPlayerController::BeginPlay()
{
Super::BeginPlay();
if (ULocalPlayer* LocalPlayer = GetLocalPlayer())
{
if (UEnhancedInputLocalPlayerSubsystem* Subsystem = LocalPlayer->GetSubsystem<UEnhancedInputLocalPlayerSubsystem>())
{
if (InputMappingContext)
{
Subsystem->AddMappingContext(InputMappingContext, 0);
}
}
}
// 캐릭터 참조 초기화
PlayerCharacter = Cast<APlayerCharacter>(GetPawn());
// HUD 위젯 생성
if (HUDWidgetClass)
{
HUDWidget = CreateWidget<UUserWidget>(this, HUDWidgetClass);
if (HUDWidget)
{
HUDWidget->AddToViewport();
}
}
// 초기 HUD 업데이트
UpdateHUD();
}
캐릭터를 참조를 초기화 하고 위젯을 불러옴 초기 업데이트 함수는 다음과 같음
void AMainPlayerController::UpdateHUD()
{
if (UPlayerHUDWidget* Widget = Cast<UPlayerHUDWidget>(HUDWidget))
{
// 캐릭터 참조
APlayerCharacter* MyPlayerCharacter = Cast<APlayerCharacter>(GetPawn());
if (!PlayerCharacter) return;
// 체력 값 가져오기 (AEntity의 Getter 사용)
int32 CurrentHealth = PlayerCharacter->GetHealth();
int32 MaxHealth = PlayerCharacter->GetMaxHealth();
// 쉴드 값 가져오기 (APlayerCharacter의 Getter 사용)
int32 CurrentShield = PlayerCharacter->GetShieldGauge();
int32 MaxShield = PlayerCharacter->GetMaxShieldGauge();
// HUD 업데이트
Widget->UpdateHealth(CurrentHealth, MaxHealth);
Widget->UpdateShield(CurrentShield, MaxShield);
}
}
캐릭터에서 체력과 쉴드를 가져와 업데이트 해줌 이외에 업데이트함수는 캐릭터함수의 takedamage함수에도 추가해줌
그러기 위해선 다음과 같이 추가해주어야함
AMainPlayerController* PC = Cast<AMainPlayerController>(GetController());
if (PC)
{
PC->UpdateHUD();
}
이후 에디터에 들어가서 이전에 디자인해둔 위젯블루프린트에 들어가 바인딩을 시켜줌

다음과 같이 추가해줌 코드에서 이미 쉴드와 체력은 갖고이기에 값을 여기서 수정해도 의미는 없음
결과는 다음과 같음
728x90
반응형