본문 바로가기

언리얼러닝/C++스크립트게임개발

RepNotify를 통해 캐릭터의 체력바 업데이트 하기

RepNotify는 복제된 변수가 변수값이 변경될때호출되는 핸들러 함수를 가질 수 있음을 의미한다.  

예를 들어 _HealthPoints에 RepNotify 함수 OnHealthPointsChanged()가 지정됐다면 변수값이 변경돼 클라이언트에 복제될때 연결된 모든 클라이언트에서 OnHealthPointsChanged()가 호출된다.

RPC와 비교했을때 RepNotify 코드가 간소화할 수 있고 네트워크 대역폭을 덜 사용하므로 좀 더 효울과적으로 사용 가능하다

RepNotify 핸들러 함수 만들기

서버에서 네트워크를 통해 특정한 속성값이 복제될때 클라이언트 사이드에서 적절한 동작을 수행하려면 함수와 이 속송을 연동해야 할것이다.

게임 Pangaea에서 Actor의 _HealthPoints값이 서버에서 업데이트 될때 체력 바가 변경되는 것을 시각화 하려면 APangaeaCharacter클래스에 UFUNCTION 매크로로 OnHealthPointsChanged()를 추가해야 한다. PangaeaCharacter.h 파일에 다음 코드를 추가한다.

 

	UFUNCTION()
	void OnHealthPointsChanged();

CPP에서 다음과 같이 구현한다.

void APangaeaCharacter::OnHealthPointsChanged()
{
	//체력바를 업데이트하기 위한 코드
}

 

void APangaeaCharacter::OnHealthPointsChanged()
{
    if (HealthBarWidget != nullptr)
    {
        float normalizedHealth = FMath::Clamp((float)_HealthPoints / HealthPoints, 0.0f, 1.0f);
        auto healthBar = Cast<UHealthBarWidget>(HealthBarWidget);
        healthBar->HealthProgressBar->SetPercent(normalizedHealth);
    }
    
    if (_AnimInstance != nullptr)
    {
        _AnimInstance->State = ECharacterState::Hit;
    }

    if (IsKilled())
    {
        PrimaryActorTick.bCanEverTick = false;
    }
}