0. 개요

레벨업이 일어나는 과정은 아래와 같다.

 

(1) 서버

- 플레이어 인터페이스의 AddToPlayerLevel -> AuraCharacter의 AddToPlayerLevel -> 플레이어 상태의 AddToLevel

-> OnLevelChangedDelegate 브로드캐스트 -> 위젯 컨트롤러

 

(2) 클라이언트

- 플레이어 상태에 레벨 변수 -> OnRep(복제 시에 발동) 노티파이 -> OnLevelChangedDelegate 브로드캐스트 -> 위젯 컨트롤러

 

서버와 클라이언트에서 레벨 변동을 처리하고 OnLevelChangedDelegate를 이용하여 위젯 컨트롤러로 값을 전달했다.

OnLevelChangedDelegate를 람다 함수로 바인딩하고 브로드캐스트 이후 전달받은 값을 UI에 표기한다.

 

 

1. 위젯 컨트롤러

(1) 델리게이트 선언

DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPlayerStatChangedSignature, int32, NewValue);
	UPROPERTY(BlueprintAssignable, Category = "GAS|Level")
	FOnPlayerStatChangedSignature OnPlayerLevelChangedDelegate;

레벨 변화 값을 가져오는 델리게이트를 선언한다.

이 델리게이트는 블루프린트에서 불러올 수 있다.

 

 

(2) 람다 함수 바인딩

void UOverlayWidgetController::BindCallbacksToDependencies()
{
    AAuraPlayerState* AuraPlayerState = CastChecked<AAuraPlayerState>(PlayerState);
    AuraPlayerState->OnXPChangedDelegate.AddUObject(this, &UOverlayWidgetController::OnXPChanged);
    AuraPlayerState->OnLevelChangedDelegate.AddLambda([this](int32 NewLevel)
        {
            OnPlayerLevelChangedDelegate.Broadcast(NewLevel);
        });

플레이어 상태에서 브로드캐스트한 OnLevelChangedDelegate에 람다 함수를 바인딩한다.

방금 선언한 델리게이트를 브로드캐스트하여 위젯으로 레벨을 전달한다.

 

이제 레벨업을 하게 되면 개요에서의 단계를 거쳐 OnLevelChanged 델리게이트에 바인딩된 람다 함수를 발동시키고, OnPlayerLevelChanged 델리게이트가 호출되어 레벨이 전달된다.

 

남은 것은 블루프린트에서 OnPlayerLevelChanged 이벤트에 바인딩하는 것이다.

 

 

2. 레벨 위젯

(1) 스펠 글로브 복제 및 수정

기존의 스펠 글로브를 복제 후 수정하여 값을 표시하는 위젯을 제작한다.

초기화, 값을 표기하는 것 이외에 스펠 아이콘을 설정하거나 어빌리티 정보를 가져오는 등과 관련된 함수와 변수를 제거한다.

 

 

(2) 델리게이트 바인딩

델리게이트가 호출되면 값을 가져와 위젯의 텍스트를 변경한다.

 

 

(3) 위젯을 오버레이에 추가

위젯을 오버레이에 추가한다.

그리고 추가한 위젯에 대해 오버레이 위젯 컨트롤러를 설정한다.

 

경험치 테이블을 적당히 조정하고 레벨업이 되는지 테스트한다.