0. 개요
오버레이 위젯 컨트롤러는 체력 글로브와 마나 글로브의 초기화, 속성 메뉴 버튼 활성화를 담당하고 있다.
속성 메뉴 버튼을 누르면 속성 메뉴(Attribute Menu) 블루프린트 위젯이 생성된다.
이 위젯에 속성의 정보를 데이터 에셋에서 꺼내와 표시하기 위해 속성 메뉴 위젯 컨트롤러를 생성해야 한다.
위젯 컨트롤러를 생성하기 전에, 위젯 컨트롤러를 효과적으로 다루기 위한 블루프린트 라이브러리를 생성한다.
- 오버레이 위젯 컨트롤러에서 작업하지 않는 이유?
1. 속성 메뉴의 생성 시간이 버튼을 누른 이후이기 때문에 포인터의 유효성이 보장되기 어려움(nullptr일 수 있음)
2. 메뉴가 비활성화 상태일 때 속성 데이터를 표시하는 작업이 불필요
1. 라이브러리(Library)
(1) 정의
재사용 가능한 코드를 모아놓은 것.
(2) 특징
- 재사용성 : 여러 프로젝트에서 반복적으로 사용 가능
- 모듈화 : 프로그램의 기능을 확장하기 쉬움, 모듈 간 서로 독립적(비종속적)
- 유지보수성 : 문제가 발생한 라이브러리의 코드를 수정하면 사용하는 모든 프로젝트에 반영됨
- 효율성 : 반복 작업 최소화, 개발 속도 상승
(3) 종류
(3-1) 정적 라이브러리(Static Library)
- 확장자 : .lib, .a
- 특징 : 컴파일 시 프로그램에 포함되며 실행 중 별도의 라이브러리를 참고할 필요 없음
- 장점 : 외부 파일로 배포할 필요가 없음
- 단점 : 동일한 라이브러리를 사용하는 여러 프로그램이 있다면 각 프로그램의 실행 파일에 라이브러리가 중복됨
(3-2) 동적 라이브러리(Dynamic Library)
- 확장자 : .dll, .so, .dylib
- 특징 : 실행 시 로드되며 메모리에 적재되어 여러 프로그램에서 참조 가능
- 장점 : 메모리와 저장공간 절약, 라이브러리 업데이트 이후 프로젝트를 다시 컴파일할 필요 없음
- 단점 : 라이브러리를 불러오지 못하면 실행 불가, 라이브러리 파일이 없으면 실행 불가
2. 블루프린트 함수 라이브러리(Blueprint Function Library)
인스턴스가 필요하지 않으며 Static 함수로 구성된다.
C++에서 호출하거나 블루프린트 노드로 사용할 수 있다.
(1) 블루프린트 생성 - AuraBlueprintLibrary 클래스
Blueprint Function Library를 상속받는 클래스를 생성한다.
(2) 코드
오버레이 위젯 컨트롤러를 get 하는 함수를 생성한다.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "UI/WidgetController/OverlayWidgetController.h"
#include "AuraAbilitySystemLibrary.generated.h"
/**
*
*/
UCLASS()
class AURA_API UAuraAbilitySystemLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintPure, category="AuraAbilitySystemLibrary|WidgetController")
static UOverlayWidgetController* GetOverlayWidgetController(const UObject* WorldContextObject);
};
GetOverlayWidgetController 함수는 위젯 컨트롤러를 가져오기 위해 월드 컨텍스트 오브젝트를 참조한다.
#include "AbilitySystem/AuraAbilitySystemLibrary.h"
#include "Kismet/GameplayStatics.h"
#include "UI/WidgetController/OverlayWidgetController.h"
#include "UI/HUD/AuraHUD.h"
#include "Player/AuraPlayerState.h"
UOverlayWidgetController* UAuraAbilitySystemLibrary::GetOverlayWidgetController(const UObject* WorldContextObject)
{
// 로컬 플레이어의 컨트롤러 가져오기
if (APlayerController* PC = UGameplayStatics::GetPlayerController(WorldContextObject, 0))
{
if (AAuraHUD* AuraHUD = Cast<AAuraHUD>(PC->GetHUD()))
{
// 위젯 컨트롤러 파라미터 구조체 생성
AAuraPlayerState* PS = PC->GetPlayerState<AAuraPlayerState>();
UAbilitySystemComponent* ASC = PS->GetAbilitySystemComponent();
UAttributeSet* AS = PS->GetAttributeSet();
const FWidgetControllerParams Params(PC, PS, ASC, AS);
return AuraHUD->GetOverlayWidgetController(Params);
}
}
return nullptr;
}
월드 컨텍스트 오브젝트를 통해 로컬 플레이어(인덱스 0)의 플레이어 컨트롤러를 가져온다.
이어서 컨트롤러를 캐스팅하여 AuraHUD를 가져와 HUD가 정상적으로 초기화되었다면 오버레이 위젯 컨트롤러를 가져오기 위해 각 파라미터를 가져온다.
(3) OverlayWidgetControllerParams 파라미터
① 플레이어 컨트롤러
② 플레이어 상태(Player State) - 플레이어의 ASC는 플레이어 상태가 소유자(Owner) 이다.
③ 어빌리티 시스템 컴포넌트(ASC)
④ 특성 세트(Attribute Set)
위의 파라미터를 오버레이 위젯 컨트롤러의 getter에 사용하면, 오버레이 위젯 컨트롤러가 존재하지 않을 때 위의 파라미터를 이용하여 새롭게 생성한다.