0. 개요
체크 포인트에 처음 도달하면 체력과 마나를 전부 회복하고, 저장되었다는 텍스트를 띄운다.
1. 저장 시 체력과 마나 회복
(1) 체력과 마나 전부 회복하는 게임플레이 이펙트 생성
체크 포인트는 한 번 도달하면 bReached 불리언을 true로 만든다.
이 불리언은 SaveGame 프로퍼티로 지정되어 있으므로, 불리언 또한 저장된다.
HandleGlowEffect 함수 내에서 bReached 불리언에 의해 오버렙 이벤트를 꺼버린다.
따라서 이미 밝혀진 체크 포인트에 닿아도 다시 저장이 안된다.
최초 저장 시에만 체력과 마나를 전부 회복하도록 할 것이므로, OnSphereOverlap 함수 안에 로직을 작성해도 무방하다.
(2) 체크 포인트 클래스
(2-1) CheckPoint 클래스 내의 멤버 변수로 게임플레이 이펙트 클래스 선언
public:
UPROPERTY(EditDefaultsOnly)
TSubclassOf<UGameplayEffect> AuraHeal;
(2-2) 게임플레이 이펙트 클래스 지정
(2-3) 게임플레이 이펙트 적용
void ACheckPoint::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
if (OtherActor->Implements<UPlayerInterface>())
{
bReached = true;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IPlayerInterface::Execute_SaveProgress(OtherActor, PlayerStartTag);
if (AAuraCharacter* AvatarActor = Cast<AAuraCharacter>(OtherActor))
{
if (UAuraAbilitySystemComponent* AuraASC = Cast<UAuraAbilitySystemComponent>(AvatarActor->GetAbilitySystemComponent()))
{
FGameplayEffectContextHandle ContextHandle = AuraASC->MakeEffectContext();
ContextHandle.AddSourceObject(AvatarActor);
FGameplayEffectSpecHandle SpecHandle = AuraASC->MakeOutgoingSpec(AuraHeal, 1.f, ContextHandle);
AuraASC->ApplyGameplayEffectSpecToSelf(*SpecHandle.Data.Get());
}
}
아바타 액터의 ASC에 접근해 AuraHeal을 이용한 이펙트 스펙 핸들을 생성하고, 해당 핸들을 이용하여 게임플레이 이펙트 스펙을 적용한다.
2. 저장 후 메시지 출력
(1) OverlayWidgetController - 오버레이에 메시지 출력하는 구조
// 플로팅 메세지
GetAuraASC()->EffectAssetTags.AddLambda(
[this](const FGameplayTagContainer& AssetTags)
{ /* 멤버 변수에 접근하려면 캡쳐 */
for (const FGameplayTag& Tag : AssetTags)
{
// Tag = Massage.HealthPotion
// "Message.HealthPotion".MatchesTag("Message")는 True
// "Message".MatchesTag("Message.HealthPotion")는 False
// 매개변수로 전달된 태그가 전부 같아야 함
FGameplayTag MessageTag = FGameplayTag::RequestGameplayTag(FName("Message"));
if (Tag.MatchesTag(MessageTag))
{
const FUIWidgetRow* Row = GetDataTableRowByTag<FUIWidgetRow>(MessageWidgetDataTable, Tag);
MessageWidgetRowDelegate.Broadcast(*Row);
}
}
}
);
메시지 위젯 데이터 테이블을 참조하여 행을 가져온다.
USTRUCT(BlueprintType)
struct FUIWidgetRow : public FTableRowBase
{
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FGameplayTag MessageTag = FGameplayTag();
UPROPERTY(EditAnywhere, BlueprintReadOnly)
FText Message = FText();
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TSubclassOf<class UAuraUserWidget> MessageWidget;
UPROPERTY(EditAnywhere, BlueprintReadOnly)
UTexture2D* Image = nullptr;
};
각 행은 태그, 메시지 내용, 전달할 메시지 위젯, 이미지 아이콘의 정보가 있다.
해당 메시지에 태그를 전달하면 블루프린트 델리게이트를 호출하여 WBP_Overlay에서 아래 구조를 통해 전달된다.
이제 메시지 전달 로직은 그대로 두고, 전달된 메시지가 위젯에 따라 표현되도록 하기 위해 UIWidgetRow 구조체를 수정한다.
(2) OverlayWidgetController의 FUIWidgetRow 구조체 수정
UENUM(BlueprintType)
enum class EMessageType : uint8
{
Floating,
TextBox,
SpellDesc
};
블루프린트 타입과 uint8로 선언하지 않으면 블루프린트에서 핀이 나타나지 않는다.
(3) WBP_Overlay 이벤트 그래프 수정
메시지 타입을 콜백 함수가 받도록 수정한다.
메시지 타입에 따라 서로 다른 위젯에 표현하도록 수정한다.
(4) 메시지 추가
이제 DT_MessageWidgetData에 행을 추가하면 된다.
(5) 특정 조건에서 게임플레이 태그를 부여
해당 메시지를 띄우기 원하는 위치에서 ASC에 해당 태그를 부여하면 된다.
예를 들어, 체크 포인트에 체력과 마나를 전부 회복하는 게임플레이 이펙트를 붙이고, 해당 게임플레이 이펙트에 태그를 부여한다.
'UE 5 스터디 > Gameplay Ability System(GAS)' 카테고리의 다른 글
31-4. UI - 체크 포인트 폴리싱 - (2) 메시지 박스 (0) | 2025.04.29 |
---|---|
[Top-Down RPG] Aura 초기 플레이 영상 (0) | 2025.04.28 |
31-2. 현재 체력과 마나를 저장하기 (0) | 2025.04.25 |
31-1. 텔레포트 어빌리티 (2) | 2025.04.22 |
30-14. 게임 종료 버튼 (0) | 2025.04.17 |