게임플레이 연동
Niagara Data Channel, Blueprint API, Niagara Component를 활용한 게임 시스템 통합을 학습합니다.
Niagara Data Channel
Niagara와 게임 코드 간 데이터 스트림
Niagara Data Channel은 Niagara System, Blueprint, 그리고 다른 Niagara System 간에 데이터를 교환하는 통신 메커니즘입니다. 이벤트 시스템의 한계(CPU 전용, 같은 System 내부)를 극복합니다.
// 1. Data Channel 에셋 생성
콘텐츠 브라우저 → 우클릭 → Niagara Data Channel
DC_ImpactData (Data Channel Asset):
{
Variables:
Position : Vector3
Normal : Vector3
Intensity : float
SurfaceType : int32
}
// 2. Blueprint에서 Data Channel에 쓰기
UNiagaraDataChannelWriter* Writer =
UNiagaraDataChannelLibrary::WriteToDataChannel(
WorldContext, DC_ImpactData
);
Writer->WriteVector("Position", HitLocation);
Writer->WriteVector("Normal", HitNormal);
Writer->WriteFloat("Intensity", DamageAmount);
// 3. Niagara System에서 Data Channel 읽기
Emitter Update / Particle Spawn:
Read from Data Channel
{
Channel: DC_ImpactData
→ Position, Normal, Intensity
}
// 이 데이터를 기반으로 파티클 생성/동작
Event: 같은 System 내, CPU Sim 전용. Data Channel: System 간, Blueprint 간, CPU/GPU 모두 지원. User Parameter: 단일 값 전달, Blueprint에서 설정. Data Channel은 프레임마다 다수의 "이벤트"를 전달할 수 있어 이벤트의 상위 호환입니다.
Niagara Component API
Blueprint/C++에서 Niagara 제어
// 이펙트 생성과 제어
UNiagaraComponent* Comp;
// 1. 이펙트 생성 (Actor에 부착)
Comp = UNiagaraFunctionLibrary::SpawnSystemAttached(
NiagaraSystem, // 에셋
RootComponent, // 부착 대상
SocketName, // 소켓 (NAME_None이면 루트)
FVector::ZeroVector,// 오프셋
FRotator::ZeroRotator,
EAttachLocation::KeepRelativeOffset,
true, // Auto Destroy
true // Auto Activate
);
// 2. 이펙트 생성 (월드에 독립)
Comp = UNiagaraFunctionLibrary::SpawnSystemAtLocation(
World, NiagaraSystem, Location, Rotation
);
// 3. 파라미터 설정
Comp->SetVariableFloat("User.Intensity", 2.0f);
Comp->SetVariableVec3("User.TargetPos", Target);
Comp->SetVariableLinearColor("User.Color", FLinearColor::Red);
// 4. 실행 제어
Comp->Activate(); // 활성화
Comp->Deactivate(); // 비활성화 (기존 파티클 유지)
Comp->DeactivateImmediate(); // 즉시 정지
Comp->ReinitializeSystem(); // 리셋 후 재시작
// 5. 상태 확인
bool bActive = Comp->IsActive();
bool bComplete = Comp->IsComplete();
이펙트 풀링과 관리
Niagara Component Pool 시스템
빈번하게 생성/소멸되는 이펙트(총알 충돌, 발자국 등)는 매번 새 컴포넌트를 생성하면 비용이 큽니다. Component Pool을 사용하면 재사용으로 비용을 절감합니다.
// Project Settings → Niagara → Component Pool
Enable Pooling: true
// SpawnSystemAtLocation에서 자동 풀링 사용
Comp = UNiagaraFunctionLibrary::SpawnSystemAtLocation(
World,
NiagaraSystem,
Location,
Rotation,
FVector::OneVector, // Scale
true, // Auto Destroy (풀에 반환)
true, // Auto Activate
ENCPoolMethod::AutoRelease // 풀링 모드
);
// Pool Method 옵션:
None // 풀링 안 함
AutoRelease // 이펙트 완료 시 자동으로 풀에 반환
ManualRelease // 수동으로 풀에 반환
// 수동 반환
Comp->ReleaseToPool();
1) 자주 사용하는 이펙트(충격, 발자국 등)는 반드시 풀링을 사용하세요. 2) Loop Behavior가 Once인 이펙트는 AutoRelease가 적합합니다. 3) 루프 이펙트는 ManualRelease를 사용하고 명시적으로 반환하세요.
실전 통합 패턴
대미지 시스템, 환경 반응형 이펙트
// C++ / Blueprint: 대미지 적중 시
void AMyCharacter::OnHit(FHitResult HitResult, float Damage)
{
// 1. 임팩트 이펙트 스폰
auto* ImpactFX = SpawnSystemAtLocation(
NS_Impact, HitResult.Location, HitResult.Normal.Rotation()
);
// 2. 대미지 강도에 따라 이펙트 크기 조절
ImpactFX->SetVariableFloat("User.Intensity", Damage / 100.0f);
// 3. 표면 타입에 따라 색상 변경
switch (HitResult.PhysMaterial->SurfaceType)
{
case Metal:
ImpactFX->SetVariableLinearColor(
"User.SparkColor", FLinearColor(1, 0.8, 0.3, 1));
break;
case Stone:
ImpactFX->SetVariableLinearColor(
"User.SparkColor", FLinearColor(0.7, 0.6, 0.5, 1));
break;
}
// 4. Data Channel로 히트 정보 브로드캐스트
// 다른 Niagara System(환경 반응 등)이 수신 가능
WriteToDataChannel(DC_HitEvents, HitResult);
}
핵심 요약
- Niagara Data Channel은 System 간, Blueprint 간 데이터를 교환하는 범용 통신 메커니즘입니다 (CPU/GPU 모두 지원).
- Niagara Component API로 Blueprint/C++에서 이펙트를 생성, 파라미터 설정, 실행 제어합니다.
- SpawnSystemAtLocation/Attached로 이펙트를 월드에 배치하거나 Actor에 부착합니다.
- Component Pool을 사용하면 빈번한 이펙트 생성/소멸의 비용을 크게 절감합니다.
- 게임 시스템(대미지, 물리, AI)의 데이터를 User Parameter와 Data Channel로 이펙트에 전달합니다.
- 표면 타입, 대미지 강도 등에 따른 동적 이펙트 변형이 게임 품질의 핵심입니다.
도전 과제
배운 내용을 직접 실습해보세요
블루프린트에서 SpawnSystemAtLocation, SetNiagaraVariableFloat/Vec3/Color 노드를 사용하여 Niagara 이펙트를 동적으로 생성하고 파라미터를 실시간 제어하세요. 피격 이펙트를 위치/방향에 맞게 스폰하세요.
Object Parameter로 게임 액터의 참조를 Niagara에 전달하고, Data Interface를 통해 액터의 위치, 속도, 체력 등을 실시간으로 읽어 이펙트에 반영하는 시스템을 만드세요.
자주 스폰/디스폰되는 이펙트(총구 화염, 발걸음 먼지 등)를 위한 오브젝트 풀링 시스템을 구현하세요. UNiagaraComponentPool을 활용하여 GC 부하를 줄이세요.