언리얼 엔진 5/개발 일지

[UE5] 블루아카이브 TPS게임 개발일지 (55) - EX 스킬 제작 3 (UParticleSystem)

ciel45 2024. 2. 2. 22:50

이번엔 총구로 빛이 모이는 연출을 만들 것이다.

 

언리얼 마켓플레이스의 Infinity Blade: Effects 에셋은 에픽게임즈가 예전에 만든 ios 게임 인피니티 블레이드의 이펙트들이 담긴 에셋이다. 무료이면서 양질의 이펙트들이 많이 포함되어 있다.

https://www.unrealengine.com/marketplace/en-US/product/infinity-blade-effects

 

Infinity Blade: Effects in Epic Content - UE Marketplace

Infinity Blade: Effects includes visual effects ranging from fire and smoke to curious lights and magical reactions, all within the Infinity Blade Collection.

www.unrealengine.com

 

 

칸나의 EX 스킬과 비슷한 이펙트가 뭐가 있을지 찾아본 결과, 적당히 어울리는 이펙트를 찾았다.

 

EX 스킬 키를 누르면, 총구에 해당 이펙트가 재생되도록 할 것이다.

이를 위해 Pistol에 새로운 프로퍼티를 만들었다.

 

 

//Pistol.h 중 일부
UPROPERTY(EditDefaultsOnly, Category = ExSkill)
UParticleSystem* ExChargeEffect;

UPROPERTY()
UParticleSystemComponent* ExChargeEffectComp;

 

ExParticleSystemComponent는 스폰한 ExChargeEffect의 컴포넌트를 담을 변수이다.

 

SpawnActor의 경우에 빗대어 본다면, ExChargeEffect는 클래스를 담는 변수, ExChargeEffectComp는 그 클래스로 만든 인스턴스를 담는 변수이다.

 

APistol의 ReadyExSkill은 Ex스킬 인풋을 누를 시, KannaCharacter에서 AGun 추상클래스를 통해 동적 바인딩되어 호출되는 함수이다. 여기에 이펙트를 재생하는 코드를 추가할 것이다.

void APistol::ReadyExSkill()
{
	Super::ReadyExSkill();

	// 총구로 빛 모이는 이펙트
	if (ExChargeEffect)
	{
		ExChargeEffectComp = UGameplayStatics::SpawnEmitterAttached(
			ExChargeEffect, Muzzle, NAME_None, FVector::ZeroVector, FRotator(90.f, 0.f,0.f), FVector::One() * 6);
	}
}

 

SpawnEmitterAttached를 통해 UParticleSystem을 스폰한다.

 

비슷한 함수로 SpawnEmitterAtLocation도 있는데, 

SpawnEmitterAtLocation는 초기 위치만 결정해주고, SpawnEmitterAttached는 이펙트를 컴포넌트에 부착시켜 준다.

 

이 경우 이펙트가 총구에 계속 붙어있어야 하므로, SpawnEmitterAttached가 더 적절하다.

 

테스트 결과, T를 누르면 총구에 빛이 잘 생기는 것을 확인할 수 있었다.

 

 

덤으로, 몇가지 추가 작업을 해주었다.

void AKannaCharacter::Fire() // 여기서는 상태 전환, 애니메이션만 재생
{
	/* 생략 */

	if (CurrentWeapon && CurrentWeapon->IsShootable()) // 널체크 -> 발사 가능 확인
	{
		/*생략*/

		// EX와 일반 총소리 구별
		if (CurrentWeapon->IsExSkillReady() && ExSkillGunSound)
		{
			UGameplayStatics::PlaySound2D(GetWorld(), ExSkillGunSound);
		}
		else
		{
			UGameplayStatics::PlaySound2D(GetWorld(), GunSound);
		}
	}
}
bool AKannaCharacter::CanUseExSkill() // 스킬 사용 가능 여부 판별
{
	return Attributes->GetExGaugePercent() >= 0.3f;
}
void APistol::FireExSkill(FHitResult& HitResult)
{
	ExChargeEffectComp->Deactivate(); // 한번 쐈다면 이펙트 비활성화

	//투사체 스폰
	FVector SpawnLocation = Muzzle->GetComponentLocation();
	FRotator SpawnRotation = UKismetMathLibrary::FindLookAtRotation(SpawnLocation, HitResult.ImpactPoint);

	FActorSpawnParameters Param;
	Param.Instigator = GetInstigator();
	GetWorld()->SpawnActor<AExProjectile>(ExProjectileClass, SpawnLocation, SpawnRotation, Param);

	ExSkillReady = false; // 한번 쐈다면 EX스킬 OFF
}

 

 

이제 적에게 명중했을 시 'BUSTED' 3d 텍스트가 뜨도록 하려고 한다.