언리얼 엔진/Gameplay Ability System - Udemy

[UE5/Gameplay Ability System(GAS)] - WidgetController

mane 2024. 2. 12. 22:37
728x90
반응형

인사말

안녕하세요. 이번 포스트에서 언리얼엔진에서 MVC 패턴 중 Controller 에 해당하는 UObject 를 구성하는 것에 대해 작성하겠습니다.

초기화 순서

  • 초기화는 캐릭터가 PossessedBy 될 때 InitAbilityActorInfo 를 통해 초기화를 합니다.

  • 그리고 AuraHUD->InitOverlay 를 통해서 WidgetController를 생성 후 OverlayWidget 에 WidgetController 를 설정합니다.

  • WidgetController 의 설정이 끝나면 AddToViewport 를 이용해서 만들어진 위젯을 뷰포트에 추가합니다.

    void AAuraCharacter::InitAbilityActorInfo()
    {
      AAuraPlayerState* AuraPlayerState = GetPlayerState<AAuraPlayerState>();
      check(AuraPlayerState);
      AuraPlayerState->GetAbilitySystemComponent()->InitAbilityActorInfo(AuraPlayerState, this);
      AbilitySystemComponent = AuraPlayerState->GetAbilitySystemComponent();
      AttributeSet = AuraPlayerState->GetAttributeSet();
    
      if(AAuraPlayerController* AuraPlayerController = Cast<AAuraPlayerController>(GetController()))
      {
          if(AAuraHUD* AuraHUD = Cast<AAuraHUD>(AuraPlayerController->GetHUD()))
          {
              AuraHUD->InitOverlay(AuraPlayerController, AuraPlayerState, AbilitySystemComponent, AttributeSet);
          }
      }    
    }

위젯 컨트롤러 초기화

위젯 컨트롤러에는 APlayerController, APlayerState, UAbilitySystemComponent, UAttributeSet라는 네 가지 주요 변수가 있습니다. 이 변수들을 쉽게 설정할 수 있도록 하기 위해, 이 네 가지를 포함하는 구조체를 만들고 이를 이용해 각각의 위젯 컨트롤러를 초기화할 수 있도록 합니다.

구조체 생성

USTRUCT(BlueprintType)
struct FWidgetControllerParams
{
    GENERATED_BODY()

    FWidgetControllerParams(){}
    FWidgetControllerParams(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS)
    : PlayerController(PC), PlayerState(PS), AbilitySystemComponent(ASC), AttributeSet(AS) {}

    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    TObjectPtr<APlayerController> PlayerController = nullptr;

    UPROPERTY()
    TObjectPtr<APlayerState> PlayerState = nullptr;

    UPROPERTY()
    TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent = nullptr;

    UPROPERTY()
    TObjectPtr<UAttributeSet> AttributeSet = nullptr;
};

이 구조체는 위젯 컨트롤러를 위한 파라미터를 저장하며, 생성자를 통해 쉽게 초기화할 수 있습니다.


위젯 컨트롤러에 변수 설정

위젯 컨트롤러 클래스 내에서 이 구조체를 사용해 위젯 컨트롤러의 변수들을 설정하는 함수를 생성합니다.

UCLASS()
class AURA_API UAuraWidgetController : public UObject
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintCallable, Category = "WidgetController")
    void SetWidgetControllerParams(const FWidgetControllerParams& WCParams);

protected:

    UPROPERTY(BlueprintReadOnly, Category = "WidgetController")
    TObjectPtr<APlayerController> PlayerController;

    UPROPERTY(BlueprintReadOnly, Category = "WidgetController")
    TObjectPtr<APlayerState> PlayerState;

    UPROPERTY(BlueprintReadOnly, Category = "WidgetController")
    TObjectPtr<UAbilitySystemComponent> AbilitySystemComponent;

    UPROPERTY(BlueprintReadOnly, Category = "WidgetController")
    TObjectPtr<UAttributeSet> AttributeSet;
};
  • 이 함수는 위젯 컨트롤러의 멤버 변수들을 구조체로부터 받은 값으로 설정합니다.
  • 위젯 컨트롤러를 초기화하는 과정에서 이 구조체와 함수를 사용하면, HUD에서 위젯을 뷰포트에 추가하는 과정에서 각각의 위젯에 적절한 컨트롤러를 쉽게 할당할 수 있습니다. 이러한 설정은 게임 내에서 위젯이 플레이어의 입력과 게임 상태에 반응하도록 만드는 데 중요한 부분입니다.

Aura HUD

Aura HUD 클래스 내에서 void InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS) 함수를 통해서 오버레이 위젯을 초기화합니다.

void AAuraHUD::InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS)
{
    checkf(OverlayWidgetClass, TEXT("Overlay Widget Class uninitialized, please fill out BP_AuraHUD"))
    checkf(OverlayWidgetControllerClass, TEXT("Overlay Widget Controller Class uninitialized, please fill out BP_AuraHUD"))


    UUserWidget* Widget = CreateWidget<UUserWidget>(GetWorld(), OverlayWidgetClass);
    OverlayWidget = Cast<UAuraUserWidget>(Widget);

    const FWidgetControllerParams WidgetControllerParams(PC, PS, ASC, AS);
    UOverlayWidgetController* WidgetController = GetOverlayWidgetController(WidgetControllerParams);

    OverlayWidget->SetWidgetController(WidgetController);

    Widget->AddToViewport();
}
728x90
반응형