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

27-3. 상위 스펠 - (3) FireBlast - 파이어볼 소환하기, 움직임 타임라인

Crat3 2025. 3. 31. 18:03

1. GA_FireBlast 클래스에 파이어볼 소환

TArray<AAuraFireBall*> UAuraFireBlast::SpawnFireBalls()
{
	TArray<AAuraFireBall*> FireBalls;

	const FVector Forward = GetAvatarActorFromActorInfo()->GetActorForwardVector();
	const FVector Location = GetAvatarActorFromActorInfo()->GetActorLocation();

	// 균일하게 회전하는 로테이터 가져오기
	TArray<FRotator> Rotators = UAuraAbilitySystemLibrary::EvenlySpacedRotators(Forward, FVector::UpVector, 360.f, NumFireBalls);

	for (const FRotator& Rotator : Rotators)
	{
		FTransform SpawnTransform;
		SpawnTransform.SetLocation(Location);
		SpawnTransform.SetRotation(Rotator.Quaternion());

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

		FireBall->DamageEffectParams = MakeDamageEffectParamsFromClassDefaults();

		// 클래스 디폴트의 데미지 값 적용
		FireBalls.Add(FireBall);

		FireBall->FinishSpawning(SpawnTransform);
	}
	return FireBalls;
}

월드에 파이어볼을 생성하고 트랜스폼을 지정한다.

파이어볼에 데미지 이펙트 파라미터를 생성한다.

라이브러리의 함수를 사용하여 균일한 방향으로 퍼지도록 설정되어있다.

 

 

2. 움직임 타임라인

파이어볼이 Aura 캐릭터 주위로 발사되어 다시 돌아오도록 할 것이다.

 

 

(1) AuraProjectile의 OnHit 함수를 블루프린트에서 호출하도록 설정

	UFUNCTION(BlueprintCallable)
	void OnHit();

 

 

(2) AuraFireBall에서 타임라인을 실행할 수 있도록 하는 블루프린트 이벤트 생성

public:
	UFUNCTION(BlueprintImplementableEvent)
	void StartOutgoingTimeline();

 

(2-1) BeginPlay에서 타임라인 실행 함수 호출

void AAuraFireBall::BeginPlay()
{
	Super::BeginPlay();
	StartOutgoingTimeline();
}

 

 

(3) BP_FireBall 이벤트 그래프에서 나가는 파이어볼 구현

액터의 위치를 멤버 변수로 설정한다.

액터의 전방 위치 벡터를 구하고, 특정 거리만큼 날아가도록 곱한다.

해당 벡터를 초기 위치에 더해주면 날아가는 최종 위치가 된다.

타임라인은 0으로 시작하여 1까지 상승하는 커브를 가진다.

선형 보간 Lerp 함수를 이용하여 A와 B 벡터 사이의 보간을 해준다.

해당 값을 Location으로 설정한다.

 

 

(4) 돌아오는 파이어볼 구현

(4-1) 파이어볼의 멤버 변수에 돌아올 액터 지정

public:
	UFUNCTION(BlueprintImplementableEvent)
	void StartOutgoingTimeline();

	UPROPERTY(BlueprintReadOnly)
	TObjectPtr<AActor> ReturnToActor;

 

 

(4-2) AuraFireBlast의 SpawnFireBalls 함수 수정

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

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

파이어볼을 소환하기 전에 돌아갈 액터를 아바타 액터로 지정한다.

 

 

(4-3) BP_FireBall의 이벤트 그래프

이전 타임라인의 Finished에 새로운 타임라인을 연결한다.

돌아오는 액터의 위치와 최종 위치를 보간하여 새로운 위치로 지정하여 돌아오게 만든다.

 

 

(5) 일정 거리를 되돌아오면 폭발하게 설정하기

돌아오면 폭발할 거리를 Explode Distance로 하여 멤버 변수로 만든다.

돌아오는 거리가 폭발 거리보다 적거나 같으면 폭발하게 된다.

위의 로직을 함수로 접고 퓨어로 지정하면 위와 같이 된다.

이후에는 사운드 컴포넌트와 이펙트 나이아가라를 정지하는 On Hit 함수를 호출하고 액터를 파괴한다.