본문 바로가기

게임프로그래밍/실습2

[실습2] 20. 어트리뷰트 변경사항 적용하기

1. 어트리뷰트 변경시 브로드캐스트 하기

 

현재 위젯 컨트롤러는 처음 초기값을 브로드캐스팅한다. 이러한 브로드캐스팅은 한번만 하고 끝이 아니라 값이 변경될때마다 지속적으로 호출되어야 할 것이다.

 

베이스 위젯 컨트롤러 클래스로가 델리게이트들을 바인딩 할 수 있는 함수를 만들 것이다. 이렇게 하면 이를 상속받는 모든 컨트롤러가 해당 함수를 사용할 수 있을 것이다.

 

virtual void BindCallbacksToDependencies();


베이스 클래스에서 실제 정의는 하지 않을 것이니 빈 함수 몸체를 놓아두면 된다.

 

자식 클래스에서 이를 오버라이드하여 사용하자.

 

이제 자식클래스에서는 바인딩할 함수를 만들어야 한다.

 

protected:
    void HealthChanged(const FOnAttributeChangeData& Data);
    void MaxHealthChanged(const FOnAttributeChangeData& Data);

 

물론 이렇게 함수를 바인딩하는 것이 아니라 람다함수를 통해 익명함수를 바인딩할 수도 있다. 그 작업은 나중에 하도록 하겠다.

 

이제 델리게이트와 함수를 바인딩 하자.

 

void UOverlayWidgetController::BindCallbacksToDependencies()
{
    const UAuraAttributeSet* AuraAttributeSet = CastChecked<UAuraAttributeSet>(AttributeSet);

    AbilitySystemComponent->GetGameplayAttributeValueChangeDelegate(
    AuraAttributeSet->GetHealthAttribute()).AddUObject(this, & UOverlayWidgetController::HealthChanged);
}

 

GAS에는 어트리뷰트 속성이 바뀔때마다 브로드캐스트를 해주는 델리게이트를 간편하게 만들 수 있게 제공해준다.

 

이제 헬스 어트리뷰트가 바뀔 때마다 콜백함수가 실행될 것이다.

 

MaxHealth도 똑같이 설정해주면 된다.

 

헬스가 변경되면 무엇을 해야할까? 사실 이미 이에 관한 델리게이트는 만들어져있다. 다시 한번 해당 델리게이트로 브로드캐스트를 하면 된다.

void UOverlayWidgetController::HealthChanged(const FOnAttributeChangeData& Data) const
{
    OnHealthChanged.Broadcast(Data.NewValue);
}

void UOverlayWidgetController::MaxHealthChanged(const FOnAttributeChangeData& Data) const
{
	OnMaxHealthChanged.Broadcast(Data.NewValue);
}

2. BindCallbacksToDependencies() 함수 호출하기

 

이제 함수를 호출해 실제로 델리게이트를 할당할 필요가 있다.

 

디펜던시 함수는 오버레이 위젯 컨트롤러가 설정될때 함께 지정해주면 좋을 것이다. 

 

UOverlayWidgetController* AAuraHUD::GetOverlayWidgetController(const FWidgetControllerParams& WCParams)
{
    if (OverlayWidgetController == nullptr)
    {
       OverlayWidgetController = NewObject<UOverlayWidgetController>(this, OverlayWidgetControllerClass);
       OverlayWidgetController->SetWidgetControllerParams(WCParams);

       OverlayWidgetController->BindCallbacksToDependencies();
    }

    return OverlayWidgetController;
}

 

오버레이 위젯 컨트롤러를 만들고 반환해주는 함수에서 이 함수를 시행해주도록 하자.

 

이제 어트리뷰트 속성을 화면에 보여주는 작업은 끝났다. 하지만 정작 어트리뷰트를 설정하지는 않았다. 이어서 어트리뷰트를 설정하여 실제로 값을 넣어줄 것이다.

 

그리고 이때 사용하는 것이 게임플레이 이펙트이다.