0. 개요

몬스터가 데미지를 입으면 해당 데미지를 띄우는 위젯 블루프린트를 생성한다.

 

 

1. 플로팅 텍스트

(1) 위젯 블루프린트 생성

UserWidget을 상속받는다.

오버레이와 텍스트를 추가하고 하단의 애니메이션 탭에서 적절한 애니메이션을 생성한다.

 

 

(2) 이벤트 그래프

Play Animation 노드를 이용하여 생성한 애니메이션을 실행한다.

 

 

2. 데미지 텍스트 컴포넌트 생성

생성한 데미지 위젯을 띄우기 위해 몬스터에게 위젯 컴포넌트를 부착한다.

 

(1) 새로운 위젯 컴포넌트 생성

Widget Component를 부모로 하는 컴포넌트를 생성한다.

 

UCLASS()
class AURA_API UDamageTextComponent : public UWidgetComponent
{
	GENERATED_BODY()
	
public:
	UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
	void SetDamageText(float Damage);
};

해당 함수 블루프린트에서 재정의 할 것이다.

 

 

(2) 데미지 텍스트 컴포넌트 블루프린트 생성

컴포넌트 블루프린트는 접두에 붙는 오브젝트를 가져와 사용한다.

이제 데미지 텍스트 컴포넌트 블루프린트는 WBP_DamageText를 가져와 사용한다.

 

 

(3) WBP_DamageText에 함수 생성

데미지 값을 받아 텍스트로 설정하는 간단한 함수이다.

 

 

(4) BP_DamageTextComponent에 노드 연결

 

 

3. 데미지 플로팅

플레이어 캐릭터가 '준' 데미지를 '대상'에게 띄울 것이다.

 

(1) 플레이어 컨트롤러

	// 위젯
	UPROPERTY(EditDefaultsOnly)
	TSubclassOf<UDamageTextComponent> DamageTextComponentClass;
};

이전에 생성한 컴포넌트를 플레이어 컨트롤러에 붙이고, 데미지를 타겟에게 부착하도록 할 것이다.

 

 

(2) 플레이어 컨트롤러에 클라이언트 RPC 생성

판정을 서버에서 호출하면 클라이언트에서 실행하는 RPC를 생성한다.

	UFUNCTION(Client, Reliable)
	void ShowDamageNumber(float DamageAmount, ACharacter* TargetCharacter);
void AAuraPlayerController::ShowDamageNumber_Implementation(float DamageAmount, ACharacter* TargetCharacter)
{
    // 위젯
    // IsValid - 사망이 보류 중일 경우를 포함
    if (IsValid(TargetCharacter) && DamageTextComponentClass)
    {
        // NewObject로 생성했을 때는 수동으로 RegisterComponent 해야함
        UDamageTextComponent* DamageText = NewObject<UDamageTextComponent>(TargetCharacter, DamageTextComponentClass);
        DamageText->RegisterComponent();
        DamageText->AttachToComponent(TargetCharacter->GetRootComponent(), FAttachmentTransformRules::KeepRelativeTransform);
        DamageText->DetachFromComponent(FDetachmentTransformRules::KeepWorldTransform);
        DamageText->SetDamageText(DamageAmount);
    }
}

준 데미지 양을 타겟 캐릭터의 루트 컴포넌트에 붙였다가 떼는 식으로 작동한다.

 

 

(3) 속성 세트

데미지 판정은 AuraAttributeSet에서 계산하고 있다.

private:
	// 콜백 데이터에서 꺼내와 구조체에 저장
	void SetEffectProperties(const FGameplayEffectModCallbackData & Data, FEffectProperties& Props) const;
	void ShowFloatingText(const FEffectProperties& Props, float Damage);
            else
            {
                // HitReact 태그 부여
                FGameplayTagContainer TagContainer;
                TagContainer.AddTag(FAuraGameplayTags::Get().Effects_HitReact);

                // 부여된 어빌리티를 찾아서 활성화
                Props.TargetASC->TryActivateAbilitiesByTag(TagContainer);
            }
            ShowFloatingText(Props, LocalIncomingDamage);
        }
    }
}

void UAuraAttributeSet::ShowFloatingText(const FEffectProperties& Props, float Damage)
{
    // 데미지 플로팅 위젯
    // 자해 불가
    if (Props.SourceCharacter != Props.TargetCharacter)
    {
        if (AAuraPlayerController* PC = Cast<AAuraPlayerController>(UGameplayStatics::GetPlayerController(Props.SourceCharacter, 0)))
        {
            PC->ShowDamageNumber(Damage, Props.TargetCharacter);
        }
    }
}

 

 

(4) AuraPlayerController 블루프린트 수정

 

 

 

4. 트러블 슈팅

(1) 텍스트가 비스듬하게 출력됨 - DamageTextComponent 블루프린트

UI의 공간을 Screen으로 설정한다.

 

 

(2) 텍스트가 커질 때 깨져보임

폰트를 크게 하고 처음은 0.44배에서 시작하여 제일 클 때를 1로 지정한다.