UE 5 스터디/Gameplay Ability System(GAS)

27-5. 상위 스펠 - (5) FireBlast - 폭발 데미지

Crat3 2025. 3. 31. 20:09

0. 개요

파이어볼이 돌아와 OnHit 함수를 호출하고 Destory 직전에 폭발 데미지를 주도록 설정한다.

 

 

1. 폭발 데미지

(1) AuraFireBall 클래스에서 폭발 데미지를 위한 FDamageEffectParams 멤버 변수 선언

	UPROPERTY(BlueprintReadWrite)
	FDamageEffectParams ExplosionDamageParams;

 

 

(2) 라이브러리에서 데미지 이펙트 파라미터의 불리언 조작하기

데미지 이펙트 파라미터 내에 있는 bIsRadialDamage 변수를 조작하는 Setter 함수를 블루프린트 함수로 정의하려 할 때, 구조체의 특성 상 FDamageEffectParams 구조체 내에서 정의할 수 없다.

 

따라서 라이브러리에 Setter를 선언한다.

	UFUNCTION(BlueprintCallable, category = "AuraAbilitySystemLibrary|GameplayEffects")
	static void SetIsRadialDamageEffectParam(UPARAM(ref) FDamageEffectParams& DamageEffectParams, bool bIsRadial, FVector InOrigin, float InnerRadius, float OuterRadius);
void UAuraAbilitySystemLibrary::SetIsRadialDamageEffectParam(UPARAM(ref)FDamageEffectParams& DamageEffectParams, bool bIsRadial, FVector InOrigin, float InnerRadius, float OuterRadius)
{
	DamageEffectParams.bIsRadialDamage = bIsRadial;
	DamageEffectParams.RadialDamageOrigin = InOrigin;
	DamageEffectParams.RadialDamageInnerRadius = InnerRadius;
	DamageEffectParams.RadialDamageOuterRadius = OuterRadius;
}

MakeDamageEffectParamsFromClassDefaults 함수에서 bIsRadialDamage가 true일 때만 방사형 데미지의 값을 디폴트에서 가져오고 있으나, FireBall은 돌아온 이후에 폭발 직전에 데미지 이펙트 파라미터를 만들어 적용하고 있기 때문에 bIsRadialDamage가 false로 전달되어 방사형 파라미터가 올바르게 지정되지 않고 있다.

따라서 라이브러리에서 해당 부분도 채워줘야 한다.

 

 

(2-1) 넉백 방향과 사망 충격파 방향 설정 함수

	UFUNCTION(BlueprintCallable, category = "AuraAbilitySystemLibrary|GameplayEffects")
	static void SetKnockbackDirection(UPARAM(ref) FDamageEffectParams& DamageEffectParams, FVector KnockbackDirection, float Magnitude = 0.f);
		
	UFUNCTION(BlueprintCallable, category = "AuraAbilitySystemLibrary|GameplayEffects")
	static void SetDeathImpulseDirection(UPARAM(ref) FDamageEffectParams& DamageEffectParams, FVector DeathImpulseDirection, float Magnitude = 0.f);
void UAuraAbilitySystemLibrary::SetKnockbackDirection(UPARAM(ref)FDamageEffectParams& DamageEffectParams, FVector KnockbackDirection, float Magnitude)
{
	// 벡터 방향만 가져와 크기를 곱하기
	KnockbackDirection.Normalize();

	if (Magnitude == 0.f)
		DamageEffectParams.KnockbackForce = KnockbackDirection * DamageEffectParams.KnockbackForceMagnitude;
	else
		DamageEffectParams.KnockbackForce = KnockbackDirection * Magnitude;
}

void UAuraAbilitySystemLibrary::SetDeathImpulseDirection(UPARAM(ref)FDamageEffectParams& DamageEffectParams, FVector DeathImpulseDirection, float Magnitude)
{
	// 벡터 방향만 가져와 크기를 곱하기
	DeathImpulseDirection.Normalize();

	if (Magnitude == 0.f)
		DamageEffectParams.DeathImpulse = DeathImpulseDirection * DamageEffectParams.DeathImpulseMagnitude;
	else
		DamageEffectParams.DeathImpulse = DeathImpulseDirection * Magnitude;
}

 

기본적으로 Magnitude 값을 전달받지 않으면 클래스 디폴트의 값을 사용하고, 값을 전달받았다면 해당 값으로 적용하도록 설정한다.

 

 

(3) AuraFireBlast 클래스의 SpawnFireBalls 함수에서 소유자 설정

		// 월드에 파이어볼 생성
		AAuraFireBall* FireBall = GetWorld()->SpawnActorDeferred<AAuraFireBall>(
			FireBallClass,
			SpawnTransform,
			GetOwningActorFromActorInfo(),
			CurrentActorInfo->PlayerController->GetPawn(),
			ESpawnActorCollisionHandlingMethod::AlwaysSpawn);

		FireBall->DamageEffectParams = MakeDamageEffectParamsFromClassDefaults();
		FireBall->ReturnToActor = GetAvatarActorFromActorInfo();
		FireBall->SetOwner(GetAvatarActorFromActorInfo());
		FireBall->ExplosionDamageParams = MakeDamageEffectParamsFromClassDefaults();

파이어볼이 소유자에게 데미지를 입히지 않게 하기 위해, 아바타 액터를 소유자로 지정한다.

 

 

(4) BP_FireBall에서 폭발 방사형 데미지 로직 구현

(4-1) DamageEffectParam의 방사형 데미지

데미지 이펙트 파라미터에 방사형 데미지 변수를 넣고 방사형 데미지를 입힐 수 있게 한다.

 

(4-2) Get Live Players Within Radius 함수 호출 및 Ignore Actors에 본인과 아바타 액터 추가

대상에게 게임플레이 이펙트를 적용하기 위해 Get Live Players Within Radius 함수를 호출한다.

Ignore Actor로 본인과 아바타 액터를 추가한다.

 

파이어볼 액터와 아바타 액터 사이의 벡터를 구해서 넉백 방향과 사망 충격파의 방향을 지정한다.

넉백 방향과 사망 충격파를 재정의하여 새로 만든 데미지 이펙트 파라미터를 이용하여 데미지 이펙트를 적용한다.

 

 

2. 디버그

폭발 데미지를 가하는 순간에 타겟의 어빌리티 시스템 컴포넌트를 찾지 못하고 크래시가 발생한다.

 

(1) 라이브러리에 Target ASC Setter 함수 선언

	UFUNCTION(BlueprintCallable, category = "AuraAbilitySystemLibrary|GameplayEffects")
	static void SetEffectParamsTargetAbilitySystemComponent(UPARAM(ref) FDamageEffectParams& DamageEffectParams, UAbilitySystemComponent* TargetASC);
void UAuraAbilitySystemLibrary::SetEffectParamsTargetAbilitySystemComponent(UPARAM(ref)FDamageEffectParams& DamageEffectParams, UAbilitySystemComponent* TargetASC)
{
	DamageEffectParams.TargetAbilitySystemComponent = TargetASC;
}

 

 

(2) 서치된 적의 ASC를 파라미터 내에 설정