본문 바로가기
카테고리 없음

25.03.04 2월 마지막 주 WIL

by alwaysyoung2 2025. 3. 4.
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
반응형