1️⃣ 개요
사용자에게 즐거움을 선사하는 FX인 VFX와 SFX의 C++ 사용법을 알아보고자 한다.
이러한 FX는 일회성으로 발생하는 FX인지와 계속해서 발생을 해야하는 FX인지에 따라 코드가 달라진다.
일회성의 경우는 VFX와 SFX 자체를 스폰하는 방법을 사용할 수 있고
다회성의 경우 컴포넌트를 생성하여 VFX와 SFX를 할당하고 활성화/비활성화하는 방법을 사용할 수 있다.
이를 아래에서 순서대로 자세히 정리하고자 한다.
2️⃣ VFX
일단 언리얼에는 Cascade와 Niagara 두가지의 이펙트가 존재한다.
Cascade는 이전 언리얼에서 사용되던 VFX이고 Niagara는 언리얼5부터 언리얼이 밀고 있는 VFX이다.
나이아가라를 알아보기 전 Cascade 이펙트도 사용할 수도 있으니 정리해보고 넘어가겠다.
🔹Cascade
일회성의 경우 h와 cpp 파일은 다음과 같다.
//.h
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effect")
UParticleSystem* ElectronicParticle;
//.cpp
//필요한 헤더
#include "Particles/ParticleSystemComponent.h"
//생성자에 작성할 코드
ElectronicParticle = nullptr;
//사용 시 작성할 코드
UParticleSystemComponent* Particle = nullptr;
if (ElectronicParticle) //파티클 스폰
{
UGameplayStatics::SpawnEmitterAtLocation(
GetWorld(),
ElectronicParticle,
GetActorLocation(),
GetActorRotation(),
false
);
}
if (ElectronicParticle) //파티클 삭제
{
FTimerHandle DestroyParticleTimerHandle;
GetWorld()->GetTimerManager().SetTimer(
DestroyParticleTimerHandle,
[Particle]()
{
Particle->DestroyComponent();
},
2.0f,
false
);
}
다회성의 경우 h와 cpp 파일은 다음과 같다.
//.h
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effect")
UParticleSystemComponent* ElectronicParticleComp;
//.cpp
//추가해야하는 헤더
#include "Particles/ParticleSystemComponent.h"
//생성자에 작성할 코드
ElectronicParticleComp = CreateDefaultSubobject<UParticleSystemComponent>(TEXT("ParticleComponent"));
ElectronicParticleComp->SetupAttachment(BoxCollision);
ElectronicParticleComp->bAutoActivate = false; //자동 활성화 끄기
//파티클 사용시 작성할 코드
if (ElectronicParticleComp)
{
ElectronicParticleComp->Activate(); //활성화
ElectronicParticleComp->Deactivate(); //비활성화
ElectronicParticleComp->ToggleActive(); //활성화/비활성화 스위치
}
ConstructorHelpers::FObjectFinder를 통해 에셋을 설정할 수 있지만
필자는 CreateDefaultSubobject를 통해 컴포넌트를 설정한 후 블루프린트를 통해 에셋을 지정하는 방법을 사용하였다.
이는 Niagara 및 사운드도 동일하게 진행된다.
🔹Niagara
나이아가라는 UMG처럼 따로 모듈을 추가해주어야 한다.
모듈을 추가한 후에는 창을 끄고 Unreal Engine Project File의 Generate Visual Studio Project Files를 해야 한다.
일회성의 경우 h와 cpp 파일은 다음과 같다.
//.h
UPROPERTY(EditAnywhere, Category = "Firing")
UNiagaraSystem* FireEffectMuzzle;
//.cpp
FireEffectMuzzle = nullptr
UNiagaraComponent* NiagaraComp = UNiagaraFunctionLibrary::SpawnSystemAttached(
FireEffectMuzzle,
WeaponMuzzle,
NAME_None,
FVector(0.f),
FRotator(0.f),
EAttachLocation::Type::KeepRelativeOffset,
true
);
다회성의 경우 h와 cpp 파일은 다음과 같다.
//.h
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Effect")
class UNiagaraComponent* HealingFxComponent;
//.cpp
//추가해야하는 헤더
#include "NiagaraSystem.h"
#include "NiagaraComponent.h"
#include "NiagaraFunctionLibrary.h"
//생성자에 작성할 코드
HealingFxComponent = CreateDefaultSubobject<UNiagaraComponent>(TEXT("NiagaraComponent"));
HealingFxComponent->SetupAttachment(FlightComp);
HealingFxComponent->SetAutoActivate(false);
//파티클 사용시 작성할 코드
if (HealingFxComponent)
{
HealingFxComponent->Activate();
HealingFxComponent->Deactivate();
}
3️⃣ SFX
일회성의 경우 h와 cpp 파일은 다음과 같다.
//.h
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Sound")
USoundBase* ExplosionSound;
//.cpp
//생성자에 작성할 코드
ExplosionSound = nullptr;
//사운드 사용시 작성할 코드
if (ExplosionSound)
{
UGameplayStatics::PlaySoundAtLocation(this, ExplosionSound, GetActorLocation());
}
컴포넌트를 할당하는 것은 다회성으로 이용할 때뿐만 아니라 일회성으로 사용할 때도 가능하다.
//.h
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Sound")
USoundBase* ExplosionSound;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Sound")
UAudioComponent* ExplosionSoundComp;
//.cpp
//추가해야하는 헤더
#include "Components/AudioComponent.h"
//생성자에 작성할 코드
ExplosionSound = nullptr;
ExplosionSoundComp = nullptr;
//사운드 사용시 작성할 코드
if (ExplosionSound)
{
ExplosionSoundComp = UGameplayStatics::SpawnSoundAttached(
ExplosionSound,
ExplosionCollision, //부착할 부모 컴포넌트
NAME_None,
FVector::ZeroVector,
EAttachLocation::KeepRelativeOffset,
true, //bStopWhenAttachedToDestroyed
1.f, //VolumeNultiplier
1.f //PitchNultiplier
);
}
다회성의 경우 h와 cpp 파일은 다음과 같다.
//.h
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Sound")
UAudioComponent* HealingSoundComp;
//.cpp
//추가해야하는 헤더
#include "Components/AudioComponent.h"
//생성자에 작성할 코드
HealingSoundComp = CreateDefaultSubobject<UAudioComponent>(TEXT("AudioComponent"));
HealingSoundComp->SetupAttachment(BoxCollision);
HealingSoundComp->bAutoActivate = false;
//사운드 사용시 작성할 코드
if (HealingSoundComp && !HealingSoundComp->IsPlaying()) //재생
{
HealingSoundComp->Play();
}
if (HealingSoundComp && HealingSoundComp->IsPlaying()) //정지
{
HealingSoundComp->Stop();
}
다음과 같이 사운드 에셋을 설정해주고
사운드가 루프되길 원한다면 에셋탐색을 눌러 사운드 에셋을 열고 다음과 같이 루프를 활성화해준다.
큐일 경우
사운드 웨이브일 경우
'Unreal' 카테고리의 다른 글
Unreal5 리슨 서버와 데디케이트 서버 (0) | 2025.03.12 |
---|---|
Unreal5 믹사모 애니메이션 강제 루트 잠금 적용시키기 (0) | 2025.02.25 |
Unreal5 미니맵 제작하기 (0) | 2025.02.12 |
Unreal5 C++ Enum (0) | 2025.02.11 |
Unreal5 3D 인터랙션 위젯 (0) | 2025.02.10 |