1. 언리얼 파티클 시스템( Cascade vs. Niagara)
- Cascade
- 오래된 파티클 시스템.
- 모듈 기반으로 작동.
- 직관적이지만 한계가 많음.
- GPU 연산 지원이 제한적.
- 커스텀 데이터 활용이 어려움.
- Niagara
- 최신 파티클 시스템.
- 노드 기반 비주얼 스크립팅.
- GPU 연산 최적화 지원.
- 커스텀 데이터 처리 가능.
- 파라미터 공유, 모듈 재사용 용이.
- Cascade보다 높은 확장성과 유연성 제공.
주요 차이점 정리
기능 | SpawnEmitterAtLocation (Cascade) | SpawnSystemAtLocation (Niagara) |
사용하는 파티클 시스템 | UParticleSystem* | UNiagaraSystem* |
GPU 최적화 지원 | ❌ | ✅ |
런타임 변수 변경 | ❌ | ✅ (SetVariableFloat 등 사용 가능) |
커스텀 데이터 활용 | ❌ | ✅ |
확장성 및 성능 | 낮음 | 높음 |
2. C++에서 Niagara 활용
(1). Build.cs 파일에 Niagara 추가:
PublicDependencyModuleNames.AddRange(new string[] { "Niagara" });
💡 추가 후 에디터 창을 닫고 .uproject 파일 -> Generate Visual Studio project files 실행 필요
(2). 헤더 파일에서 필요한 라이브러리 포함:
#include "NiagaraFunctionLibrary.h"
#include "NiagaraComponent.h"
3. NiagaraFuctionLibrary.h 주요 함수
(1). SpawnSystemAtLocation
static UNiagaraComponent* SpawnSystemAtLocation(
const UObject* WorldContextObject, // 월드 컨텍스트
UNiagaraSystem* SystemTemplate, // 생성할 Niagara 시스템
FVector Location, // 생성 위치
FRotator Rotation = FRotator::ZeroRotator, // 회전
FVector Scale = FVector(1.0f), // 스케일
bool bAutoDestroy = true, // 자동 제거 여부
bool bAutoActivate = true, // 자동 활성화 여부
ENCPoolMethod PoolingMethod = ENCPoolMethod::None, // 풀링 방식
bool bPreCullCheck = true // 가시성 검사 여부
);
- 특정 위치에서 Niagara 파티클 시스템을 생성
각 매개변수 설명
매개변수 | 설명 |
WorldContextObject | Niagara 시스템을 생성할 월드 컨텍스트 객체 (보통 GetWorld() 사용) |
SystemTemplate | 생성할 Niagara 시스템 템플릿 (UNiagaraSystem*) |
Location | 파티클 생성 위치 |
Rotation | 파티클 회전값 (기본값: FRotator::ZeroRotator) |
Scale | 파티클 크기 조정값 (기본값: FVector(1.0f)) |
bAutoDestroy | true이면 파티클이 종료되면 자동 삭제 (false이면 관리 필요) |
bAutoActivate | true이면 생성 즉시 파티클 활성화 |
PoolingMethod | 풀링 방식 선택 (기본값: ENCPoolMethod::None) |
bPreCullCheck | true이면 보이지 않는 파티클은 생성 안 함 |
풀링(Pooling) 방식 설명
None | 풀링 안 함 (매번 새로 생성) |
AutoRelease | 사용 후 자동으로 풀에 반환 |
ManualRelease | 수동으로 반환해야 함 |
ManualRelease_OnComplete | 파티클이 끝나면 풀에 반환 |
- 오브젝트 재사용을 통해 성능을 최적화할 수 있는 옵션.
(2). SetVariableFloat / SetVariableVec3 / SetVariableMaterial 등
// 파티클 크기,투명도, 속도 조절
NiagaraComp->SetVariableFloat(TEXT("MyFloatVar"), 10.0f);
// 파티클 이동 방향 설정
NiagaraComp->SetVariableVec3(TEXT("MyVecVar"), FVector(100.0f, 0.0f, 0.0f));
NiagaraComponent->SetVariableMaterial("MyMaterialVar", MyMaterialInstance);
- Niagara 파티클 내부 변수 값을 실시간으로 변경.
- Niagara에서 변수 등록하기
- Niagara System에서 Emitter 선택
- Parameters 창에서 새로운 Float 또는 Vector 변수 추가
(3). OverrideSystemUserVariable
NiagaraComponent->OverrideSystemUserVariable("SpeedMultiplier", 2.5f);
- Niagara 시스템의 사용자 정의 변수를 런타임에 동적으로 변경 가능.
(4). ResetSystem
NiagaraComponent->ResetSystem();
-
- Niagara 시스템을 강제로 초기화하여 다시 실행 가능.
(5). SpawnSystemForPlayer
UNiagaraFunctionLibrary::SpawnSystemForPlayer(NiagaraSystem, PlayerController);
- 특정 플레이어에 대한 파티클 시스템을 생성하는 함수.
- 멀티플레이 환경에서 유용.
(6). SetNiagaraVariableBool
NiagaraComponent->SetNiagaraVariableBool("bIsActive", true);
- 특정 Niagara 변수의 Bool 값을 설정.
(7) AdvanceSimulationByTime
// 생성된 후 3초 지난 상태로 시뮬레이션 강제 진행
NiagaraComp->AdvanceSimulationByTime(3.0f, 30);
- Niagara 시스템의 시뮬레이션을 특정 시간만큼 미리 진행할 수 있음.
- 즉, 파티클이 시작부터 일정 시간이 지난 상태로 나타나도록 만들 수 있음
4. Niagara 파티클 적용 예시
참조:
✏️ 역시 시각적인 요소를 다루는게 재밌긴 하네요
'TIL > C++와 UE' 카테고리의 다른 글
Enemy(Monster) 클래스 (0) | 2025.02.24 |
---|---|
언리얼 엔진 AI 행동 제어 시스템 (0) | 2025.02.17 |
게임 메뉴 UI 디자인 (0) | 2025.02.07 |
Pawn 클래스 캐릭터의 부드러운 움직임 (1) | 2025.02.05 |
비행체 움직임 (0) | 2025.01.28 |