파티클 시스템

언리얼 거토
|2025. 2. 11. 19:32

1. 언리얼 파티클 시스템( Cascade vs. Niagara)

  1. Cascade
    • 오래된 파티클 시스템.
    • 모듈 기반으로 작동.
    • 직관적이지만 한계가 많음.
    • GPU 연산 지원이 제한적.
    • 커스텀 데이터 활용이 어려움.
  2. 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에서 변수 등록하기
    1. Niagara System에서 Emitter 선택
    2. 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 파티클 적용 예시

 


참조:

1. Using Niagara in C++

2. UNiagaraFunctionLibrary

3. UNiagaraComponent


✏️ 역시 시각적인 요소를 다루는게 재밌긴 하네요


 

'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