언리얼 엔진 5/개발 일지

[UE5] 블루아카이브 TPS게임 개발일지 (29) - 총구 화염 효과

ciel45 2024. 1. 6. 11:23

이번엔 사격 시 총구 화염을 적용해보았다.

 

언리얼에서 파티클 시스템을 구현하는 에셋은 두가지 종류가 있다. 각각 Cascade, Niagara이다.

 

나이아가라는 캐스케이드를 발전시킨 것이라 여러 면에서 뛰어나지만, 비교적 최근에 나온 것이라 정보, 자료가 많이 없다.

반대로 말하면 캐스케이드는 레거시 에셋이지만 그만큼 리소스가 풍부하다.

따라서 여기서는 캐스케이드를 사용하였다.

 

에셋은 여기에 들어있는 것을 사용하였다.

이펙트들은 보통 따로 파는 것 보단 이렇게 팩에 끼워주는 경우가 더 많다.

 

 

우선 적에게 화염 효과를 달아주는 것 부터 시작하였다.

효과가 재생될 기준점으로 새로운 ArrowComponent를 만들어, 총구에 맞춰 위치시켜주었다.

AssultRifle에 붙어있는 Muzzle 컴포넌트가 그것이다.

 

그리고 적의 One Shot 함수, 즉 단발 사격 함수에 캐스케이드가 머즐에 붙어 재생되도록 하였다.

캐스케이드를 재생시키기 위해서는 Spawn Emitter Attached / Spawn Emitter at Location 노드를 사용하면 된다.

여기서는 Spawn Emitter Attached를 사용하였다.

Spawn Emitter Attached는 말그대로 부착된 채로 재생되기 때문에 횃불같은 것에 사용하기 적합하다.

Spawn Emitter at Location은 지정된 위치에서만 재생되기 때문에 효과의 위치가 다른 것에 지속적으로 종속적이지 않을 때 사용하기 적합하다.

 

그래서 사실 총구 화염도 Attached보다는 at Location을 사용하는 것이 나을 수도 있지만, 총구 화염은 지속시간이 굉장히 짧아서 사실 그닥 상관이 없다고 생각한다.

 

노드의 Emitter Template에 적절한 에셋을 넣어주는 것이 핵심이다.

Emitter Template 선택 창

 

 

다음은 플레이어의 총구 화염 이펙트이다.

 

Pistol 클래스의 Fire 함수가 원래는 라인트레이싱만 하는 함수였는데, 여기에 총구 화염 재생도 맡도록 하였다.

 

우선 Pistol의 부모클래스인 Gun의 헤더에 BlueprintImplementableEvent를 추가하였다.

	UFUNCTION(BlueprintImplementableEvent)
	void MuzzleFlashEffect();

 

그리고 Pistol의 Fire함수를 다음과 같이 만들었다.

void APistol::Fire(FVector& StartPoint, FVector& Direction)
{
	FHitResult HitResult;
	FVector EndPoint = StartPoint + Direction * Range;

	if (GetWorld())
	{
		if (GetWorld()->LineTraceSingleByChannel(
			HitResult,
			StartPoint,
			EndPoint,
			ECollisionChannel::ECC_Visibility))
		{
			if (HitResult.GetActor())
			{
				if (IHitInterface* HitObject = Cast<IHitInterface>(HitResult.GetActor()))
				{
					HitObject->GetHit();
				}

				UGameplayStatics::ApplyPointDamage(
					HitResult.GetActor(),
					Damage,
					Direction,
					HitResult,
					GetInstigator()->GetController(),
					this,
					UDamageType::StaticClass()
				);
			}
		}
	}

	MuzzleFlashEffect();
}

 

BP_Pistol에서는 MuzzleFlashEffect를 구현하였다.

 

 

테스트 영상:

 

 

 

사실 이번엔 플레이어의 총구 화염 효과는 C++로만 만들려고 했는데, 자꾸 Arrow 컴포넌트를 null로 읽어버리는 문제가 있었고, 결국 일단 블루프린트로 구현하였다.

 

이것도 추후에 C++ 코드로 바꾸려고 생각중이다.