0. 개요

게임플레이 이펙트 컨텍스트를 통해 공격의 블록, 크리티컬 여부를 확인할 수 있게 되었다.

이 변수들을 이용해 화면에 색이 있는 데미지 텍스트를 띄운다.

 

 

1. 흐름 파악

(1) 커스텀 속성 세트

- PostGameplayEffectExecute 함수 호출

- 아래의 함수 호출

 ShowFloatingText(Props, LocalIncomingDamage, bBlock, bCriticalHit);

 

(2) 커스텀 플레이어 컨트롤러

- ShowFloatingText가 PC를 캐스팅하여 ShowDamageNumber RPC 함수를 호출

- 데미지 텍스트 컴포넌트를 생성

- Register -> Attach를 통해 컴포넌트를 부착 후 Detach를 통해 다시 떼어냄

- 컴포넌트의 SetDamageText 함수를 이용하여 값을 전달

 

 

2. 코드 수정

(1) DamageTextComponent

이전 포스트에서 속성 세트의 ShowFloatingText의 인수를 변경했다.

해당 함수처럼 두개의 불리언을 가져올 수 있게 수정한다.

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

 

 

(2) AuraPlayerController

	UFUNCTION(Client, Reliable)
	void ShowDamageNumber(float DamageAmount, ACharacter* TargetCharacter, bool bBlockedHit, bool bCriticalHit);
void AAuraPlayerController::ShowDamageNumber_Implementation(float DamageAmount, ACharacter* TargetCharacter, bool bBlockedHit, bool bCriticalHit)
{
    // 위젯
    // 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, bBlockedHit, bCriticalHit);
    }
}

 

 

(3) AuraAttributeSet

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

 

 

3. 블루프린트 수정

변화된 코드에 따라 블루프린트도 수정한다.

 

(1) WBP_DamageText 블루프린트에 새로운 함수 생성

블록과 크리티컬 여부를 판단하는 불리언 두개를 가져와 각각의 여부를 따지는 함수를 만든다.

각 상황에 따라 Color (Slate Color 타입) 멤버 변수를 Set 하게 된다.

위 함수에서 결정된 컬러를 데미지 텍스트에 적용하도록 Update Damage Text 함수도 수정한다.

 

 

(2) BP_DamageTextComponent 수정

 

 

(3) GE_SecondaryAttributes 수정

테스트 후 캐릭터의 크리티컬 확률이 너무 낮게 설정되어있었다.

위의 결과에 따르면 방어 관통의 두 배를 곱한 값의 1/4를 크리티컬 확률로 계산하는데, 적정한 수치로 재조정한다.

 

방어 관통도 수정한다.

Resilience의 3배를 취한 후 0.15배를 방어 관통으로 가지는데 이 값을 적정한 수치로 재조정한다.