본문 바로가기

게임프로그래밍/실습1

[언리얼 실습] 76. HUD 변수 초기화 & 체력바 업데이트


목차

  1.  오버레이 초기화 하기
  2.  체력바 업데이트 하기
  3.  함수 수정 준비

1. 오버레이 초기화 하기

 

현재 오버레이를 사용하고 있고 이곳에서 체력과 스테미나 골드, 소울을 보여주고 있다. 이 값들을 초기화 하는 법을 알아보자.

 

오버레이에서 사용하고 있는 변수들은 캐릭터와 관련된 변수들이고 그렇기에 캐릭터 클래스에서 접근할 것이다.

 

캐릭터 클래스의 BeginPlay 함수로 들어가자.

APlayerController* PlayerController = Cast<APlayerController>(GetController());
if (PlayerController)
{
	ASlashHUD* SlashHUD = Cast<ASlashHUD>(PlayerController->GetHUD());
	
}

 

다음과 같이 하면 HUD 클래스를 가져올 수 있다.

 

SlashHUD 에는 오버레이 변수가 있는데 이것을 가져올 방법이 현재는 없다.

 

// ASlashHUD.h

FORCEINLINE USlashOverlay* GetSlashOverlay() const { return SlashOverlay; }

 

Getter를 만들자.

 

다시 캐릭터 클래스로 들어가 이것을 가져올 수 있다. 물론 헤더파일들도 다 추가해야한다.

 

APlayerController* PlayerController = Cast<APlayerController>(GetController());
if (PlayerController)
{
	ASlashHUD* SlashHUD = Cast<ASlashHUD>(PlayerController->GetHUD());
	if (SlashHUD)
	{
		USlashOverlay* SlashOverlay = SlashHUD->GetSlashOverlay();
	}
	
}

 

이제 이렇게 오버레이까지 가져올 수 있다.

 

그리고 오버레이에는 변수들을 설정할 수 있는 Setter가 있다.

 

APlayerController* PlayerController = Cast<APlayerController>(GetController());
if (PlayerController)
{
	ASlashHUD* SlashHUD = Cast<ASlashHUD>(PlayerController->GetHUD());
	if (SlashHUD)
	{
		USlashOverlay* SlashOverlay = SlashHUD->GetSlashOverlay();

		if (SlashOverlay && Attributes)
		{
			SlashOverlay->SetHealthBarPercent(Attributes->GetHealthPercent());
			SlashOverlay->SetStaminaBarPercent(1.f);
			SlashOverlay->SetGold(0);
			SlashOverlay->SetSouls(0);
		}
	}
	
}

 

이렇게 해서 초기값을 설정해주었다. 스테미나, 골드, 소울 등은 현재 값을 가지고 올 수 있는 어트리뷰트 클래스에 함수가 존재하지 않아 일단은 하드코딩을 해준다.

 

 

값들이 정상적으로 초기화 된 것을 볼 수 있다.

 

이제 다시 비주얼 스튜디오로 돌아간뒤 SlashOverlay 변수만 멤버변수로 바꿔주고 끝내자.


2. 체력바 업데이트 하기

 

이제 오버레이(위젯)에도 접근할 수 있으니 상태바, 그중에서 체력바를 업데이트하자. 나머지 항목들은 아직 제대로 구현이 되어있지 않아 체력바 먼저 할 것이다.

 

현재 플레이어는 TakeDamage() 함수에서 피격을 담당하고 있다.

 

float AKnight::TakeDamage(매개변수 생략)
{
	HandleDamage(DamageAmount);
	if (SlashOverlay && Attributes)
	{
		SlashOverlay->SetHealthBarPercent(Attributes->GetHealthPercent());
	}
	return DamageAmount;
}

 

이렇게 하면 피격 될 때마다 오버레이를 업데이트 할 수 있을 것이다.


3. 함수 수정 준비

 

이제 오버레이와는 관계없지만 게임 로직에서 중요한 부분을 수정할 것이다.

void AKnight::GetHit_Implementation(const FVector& ImpactPoint, AActor* Hitter)
{
	Super::GetHit_Implementation(ImpactPoint, Hitter);

	SetWeaponCollisionEnabled(ECollisionEnabled::NoCollision);
	ActionState = EActionState::EAS_HitReaction;
}

 

void ABaseCharacter::GetHit_Implementation(const FVector& ImpactPoint, AActor* Hitter)
{
	if (IsAlive() && Hitter) DirectionalHitReact(Hitter->GetActorLocation());
	else Die();

	PlayHitSound(ImpactPoint);
	SpawnHitParticles(ImpactPoint);
}

 

현재 Hit 함수가 이렇게 설정되어있다. (아래쪽은 부모 위쪽은 자식)

 

이렇게 하면 현재 플레이어가 데스 몽타주가 없고 따라서 그 어떤 몽타주도 재생되지 않아 노티파이가 실행되지 않고 영원히 HitReaction 상태로 유지된다는 것이다.

 

따라서 플레이어가 죽었다면 상태를 바꿔주고 더 이상 히트가 되지 않게 콜리전도 없애줄 것이다.

 

그것은 다음에 이어서 해보겠다.