0. 개요
지금은 AuraHUD가 초기화 될 때 카드 선택 UI가 초기화되도록 하드 코딩 되어 있다.
이제 구조를 변경하여 특정 액터를 클릭하면 카드 선택 UI가 노출되도록 설정한다.
또한 한 번 액터를 통해 업그레이드를 선택하면 다시 클릭해도 반응이 없도록 한다.
1. 델리게이트
(1) 델리게이트 선언 변경
AuraHUD에 위치한 기존의 델리게이트 유형을 다이내믹 멀티캐스트 유형으로 변경한다.
// GameMode 초기화 이후 호출
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnInitializeGameMode);
(2) 바인딩 변경
AddUObject를 통해 콜백 함수를 바인딩하는 것이 아닌 AddDynamic 함수를 사용한다.
// 하드코딩 - 게임 모드가 초기화되면 업그레이드 카드 선택 UI 노출
OnInitializeGameModeDelegate.AddDynamic(this, &AAuraHUD::InitializeCardSelectionUI);
(2-1) 콜백 함수 수정
UFUNCTION()
void InitializeCardSelectionUI();
AddDynamic으로 바인딩 된 콜백 함수는 UFUNCTION으로 지정한다.
- 다이내믹으로 선언된 델리게이트는 런타임에 콜백 함수를 바인딩 하는데, UFUNCTION으로 지정되지 않은 함수는 리플렉션 시스템에 등록이 되지 않아 바인딩이 불가능하게 된다.
(3) 델리게이트 변경
public:
UPROPERTY(BlueprintCallable)
FOnInitializeGameMode OnInitializeGameModeDelegate;
블루프린트에서 호출할 수 있도록 델리게이트에 UPROPERTY를 추가한다.
2. 체크 포인트 액터
(1) 타임라인 애니메이션
체크 포인트 액터의 메시를 상자로 설정하고, 상자의 윗 부분을 타임라인에 따라 열리는 것처럼 보이게 한다.

타임라인 애니메이션이 끝나면 카드 선택 UI를 생성하는 델리게이트를 호출한다.
(2) On Sphere Overlap 바인딩

겹친 액터로부터 AuraHUD를 얻어 델리게이트를 호출한다.
3. 델리게이트 구조 변경
(1) AuraHUD - 카드 선택 UI 뷰 모델 생성 위치 변경
void AAuraHUD::InitOverlay(APlayerController *PC, APlayerState *PS, UAbilitySystemComponent *ASC, UAttributeSet *AS)
{
// 위젯과 위젯 컨트롤러 생성
checkf(OverlayWidgetClass, TEXT("Overlay Widget not Initialized. BP_AuraHUD"));
checkf(OverlayWidgetControllerClass, TEXT("Overlay Widget Controller not Initialized. BP_AuraHUD"));
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// 카드 선택 UI 뷰 모델 생성
CardSelectionViewModel = NewObject<UMVVM_CardSelection>(this, CardSelectionViewModelClass);
CardSelectionViewModel->InitializeSlot();
// 게임 모드 초기화 이후에 해당 델리게이트를 호출하여 카드 선택 UI 생성 하기
OnInitializeGameModeDelegate.AddDynamic(this, &AAuraHUD::InitializeCardSelectionUI);
// 플레이어 컨트롤러 초기화 완료 델리게이트 바인딩
OnInitializePlayerControllerDelegate.AddUObject(this, &AAuraHUD::OnInitializePlayerController);
}
HUD가 초기화될 때 뷰 모델을 생성하게 변경한다.
(2) 카드 초기화 델리게이트 바인딩
void AAuraHUD::InitializeCardSelectionUI()
{
// 뷰 생성
CardSelectionWidget = CreateWidget<ULoadScreenWidget>(GetWorld(), CardSelectionWidgetClass);
CardSelectionWidget->AddToViewport();
CardSelectionWidget->BlueprintInitializeWidget();
//
ReceivedCardsDelegate.AddUObject(this, &AAuraHUD::HandleRandomAbilityUpgrade);
// 게임모드의 델리게이트 호출 -> 카드를 이니셜라이즈
InitializeCardsDelegate.Broadcast(GetOwningPlayerController());
}
위 콜백 함수 내의 델리게이트가 호출은 되지만 바인딩되어 있지 않다.
이를 GameModeBase에서 바인딩한다.
void AAuraGameModeBase::PostLogin(APlayerController* NewPlayer)
{
Super::PostLogin(NewPlayer);
if (NewPlayer)
{
if (AAuraHUD* AuraHUD = Cast<AAuraHUD>(NewPlayer->GetHUD()))
{
// 어빌리티 업그레이드 카드 세팅
AuraHUD->InitializeCardsDelegate.AddUObject(this ,&AAuraGameModeBase::HandleInitializeCards);
void AAuraGameModeBase::HandleInitializeCards(APlayerController* PC)
{
if (AAuraPlayerController* AuraPC = Cast<AAuraPlayerController>(PC))
{
if (AAuraPlayerState* AuraPS = AuraPC->GetPlayerState<AAuraPlayerState>())
{
AuraPS->GetRandomUpgradeTagsForActivatedAbility_Three();
}
}
}
여기에서 세 개의 업그레이드 태그를 뽑는 함수를 발동하면 이후에 카드로 업그레이드 태그가 반영되는 로직이 실행된다.
