1. 태그 브로드 캐스트 하기
이제 태그를 브로드 캐스트 하여 원하는 태그들을 화면에 보여주는 작업을 할 것이다. 이때 직접 HUD나 위젯으로 브로드 캐스트 하는 것이 아닌 위젯 컨트롤러에서 이 브로드캐스팅 한 값을 받을 수 있게 할 것이다.
ASC 클래스에서 델리게이트를 선언하자.
DECLARE_MULTICAST_DELEGATE_OneParam(FEffectAssetTags, const FGameplayTagContainer&)
위젯 컨트롤러 ASC 모두 이와 바인딩 할 수 있어야 한다. 그렇기에 퍼블릭 공간에서 사용할 것이다.
일단 먼저 브로드 캐스트 기능을 완성하자.
void UAuraAbilitySystemComponent::EffectApplied(UAbilitySystemComponent* AbilitySystemComponent,
const FGameplayEffectSpec& EffectSpec, FActiveGameplayEffectHandle ActiveEffectHandle)
{
FGameplayTagContainer TagContainer;
EffectSpec.GetAllAssetTags(TagContainer);
EffectAssetTags.Broadcast(TagContainer);
}
이제 오버레이 위젯 컨트롤러에서 바인딩 작업을 해야할 것이다.
오버레이 위젯 컨트롤러에는 아래와 같은 함수가 있다. 해당 함수에서 ASC의 구성이 완료되어 있어 기능을 이용할 수 있다.
BindCallbacksToDependencies
익명함수를 바인딩해주자.
Cast<UAuraAbilitySystemComponent>(AbilitySystemComponent)->EffectAssetTags.AddLambda(
[](const FGameplayTagContainer& AssetTags)
{
for (const FGameplayTag& Tag : AssetTags)
{
const FString Msg = FString::Printf(TEXT("Tag Name : %s"), *Tag.ToString());
GEngine->AddOnScreenDebugMessage(-1, 8.f, FColor::Blue, Msg);
}
}
);
이제 태그들을 구분할 수 있으니 이 태그에 따른 작업을 구현해야할 것이다.
2. 태그와 메세지를 연결할 구조체 만들기
태그를 바로 위젯을 보내 위젯에서 태그를 식별하여 메세지를 표시하는 것 보다는 위젯컨트롤러에서 태그와 이와 관련된 요소들을 담은 구조체를 만들어 이 구조체를 이용해서 메세지를 표시할 것이다.
오버레이 위젯 컨트롤러 헤더파일로 들어가자.
USTRUCT(BlueprintType)
struct FUIWidgetRow : public FTableRowBase
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FGameplayTag MessageTag = FGameplayTag();
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FText Message = FText();
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TSubclassOf<UAuraUserWidget> MessageWidget;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UTexture2D* Image = nullptr;
};
위 구조체가 있으면 에디터에서 메세지와 태그를 연결하는 작업을 할 수 있다. 에디터로 들어가자.
데이터 테이블을 만들어준다.
이렇게 데이터 테이블이 생겼다. 이제 이를 채우면 될 것이다.
이제 한가지 작업을 해야한다. 생각해보면 태그를 읽고 보내는 작업은 해왔지만 정작 보낼 메세지 태그를 만들지는 않았다. (지금까지는 그저 속성 태그를 보냈다.)
메세지 태그를 따로 만들도록 하자.
3. 델리게이트에 바인딩 하기
이제 태그도 준비되었다. 이태그를 델리게이트를 통해 브로드 캐스트 할 수 있어야 한다.
태그와 구조체의 태그를 비교하여 메세지를 가져올 것이고 그러기 위해서는 이 구조체 정보가 필요할 것이다. 이 구조체(데이터 테이블)를 저장할 변수를 만들자.
protected:
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="Widget Data")
TObjectPtr<UDataTable> MessageWidgetDataTable;
이제 이 변수에서 태그를 비교하고 델리게이트를 설정하면 된다. 에디터에서 해당 변수를 채우는 것을 잊지 말도록 하자.
또한 데이터 테이블을 채워놓아야 한다. 사실 이 과정에서 실수를 할 가능성이 높아 데이터 테이블보다는 데이터 에셋을 사용하는 것이 효율적이라고 한다.
데이터 테이블을 다 채우고 이어서 작업하도록 하자
'게임프로그래밍 > 실습2' 카테고리의 다른 글
[실습 2] 29. 클램핑 버그 고치기 (0) | 2024.11.30 |
---|---|
[실습2] 28. 태그 브로드 캐스팅 하기 - 2 (0) | 2024.11.30 |
[실습2] 26. 게임 플레이 이펙트에 게임플레이 태그 적용하고 태그 출력하기 (0) | 2024.11.30 |
[실습2] 25. PostGameplayEffectExecute() - 어트리뷰트 변경 후 호출되는 함수 (0) | 2024.11.30 |
[실습2] 24. PreAttributeChange 함수로 클램핑 적용하기 (0) | 2024.11.30 |