이벤트 기반 파티클 스폰
피격·획득·충돌 이벤트가 발생한 순간에만 시스템을 스폰하고 위치·충격 강도 같은 데이터를 사용자 변수로 전달합니다.
피격·아이템 획득·발사체 충돌처럼 한 번 발생하는 사건에는 필요한 순간에 짧은 Niagara System을 생성합니다. 사건의 위치·방향·강도를 초기값으로 전달하면 같은 효과를 여러 상황에 재사용할 수 있습니다.
위치 스폰과 부착 스폰
- Spawn System at Location: 월드의 지정 위치·회전에 시스템을 만듭니다. 스파크·폭발처럼 발생 지점에 남을 효과에 적합합니다.
- Spawn System Attached: Scene Component에 부착하고 Attach Point Name과 위치 규칙을 지정합니다. Actor 자체를 Attach To Component에 넣지 않습니다. 생성 후 입자까지 따라갈지는 Local Space 설정도 확인합니다.
두 경로 모두 반환 Niagara Component, 초기 활성화, 종료와 회수 정책을 함께 다룹니다. 일반 Spawn 노드에는 임의 변수 목록을 싣는 Parameters 핀이 없습니다. Spawn System at Location 입력·출력
초기값을 먼저 전달하는 순서
Spawn이 실패해도 게임의 충돌 처리는 완료합니다. 효과는 유한 수명과 Auto Destroy로, 발사체는 게임 로직에서 각각 정리합니다.
Auto Activate를 끄고 생성한 뒤 반환 컴포넌트가 유효하면 타입에 맞는 Set Niagara Variable로 User.* 값을 설정하고 Activate합니다. 시스템 시작 후 Spawn 값만 바꾸면 이미 생성된 Burst에 반영되지 않을 수 있습니다. 이름·타입·모듈 연결까지 맞춰야 합니다.
직접 해보기: 총알 충격 스파크
Niagara 시스템 준비
기본 Sprite 시스템을 복제해 NS_ImpactSparks를 만듭니다. 연속 Spawn Rate를 제거하고 Emitter State를 Self/Once로 설정합니다. 수명 종료 입자가 모두 마무리되면 시스템도 완료되는 설정을 사용합니다.
Float User.ImpactStrength를 만들고 기본값을 1로 둡니다. Emitter Update의 Spawn Burst Instantaneous에서 시간 0에 RoundToInt(Clamp(ImpactStrength, 0, 1) × 100)개를 생성합니다. Spawn Count는 정수이며 0이면 생성하지 않는 의도적인 경우입니다.
Particle Spawn의 Initialize Particle에서 Lifetime 0.20.5초, Sprite Size 25 cm, Color (1,0.8,0,1)을 설정합니다. Add Velocity에서는 로컬 +Z 중심의 좁은 원뿔 방향에 속력 100 cm/s를 줍니다. 모든 방향으로 퍼지는 완전한 구면 분포는 시스템 회전을 바꿔도 표면 방향성이 드러나지 않습니다.
초기 속도 공간을 Local로 지정해 시스템의 +Z 회전을 반영하고, 입자는 생성 후 월드에 남도록 Emitter Local Space는 끕니다. Particle Update에 Particle State, Gravity Force, Drag 5, Solve Forces and Velocity를 둡니다.
Sprite Renderer에 프로젝트의 Additive/Unlit 스파크 머티리얼을 할당합니다. Particle Color RGB와 Alpha가 연결되어야 합니다. 특정 M_Fire_SubUV 에셋이 기본 설치에 있다고 가정하지 않습니다.
발사체 Blueprint
발사체가 없다면 Sphere Collision을 루트로, Projectile Movement의 Updated Component를 해당 Sphere로 구성합니다. 이동 속도와 벽을 차단하는 collision preset을 정하고, 이동 방식에 맞는 Hit 이벤트 발생 설정을 확인합니다.
BP_BulletProjectile의 Sphere에서 On Component Hit 이벤트를 추가합니다. 이 실습은 blocking Hit를 사용합니다. Overlap은 위치·법선·충격량이 같은 방식으로 제공되는 대체 이벤트가 아닙니다.
중복 Hit를 막는 처리 Bool을 먼저 검사하고 한 번 처리한 뒤에는 다시 스폰하지 않게 합니다. Hit 구조체를 Break Hit Result로 나누어 Impact Point와 Impact Normal을 얻습니다.
미리 저장한 충돌 전 발사체 속력 또는 게임에서 정의한 충격 강도를 Map Range Clamped로 01로 변환합니다. 예를 들어 03000 cm/s를 0~1로 매핑할 수 있습니다. Swept 이동의 Normal Impulse가 0일 수 있고 충돌 후 속도는 이미 바뀌었을 수 있으므로 항상 충격량 핀만 사용하지 않습니다.
Spawn System at Location의 System Template에 NS_ImpactSparks를 넣고 Location에는 Impact Point, Rotation에는 Make Rot From Z(Impact Normal)을 연결합니다. Scale은 1, Auto Activate는 false, Auto Destroy는 true, Pooling Method는 None으로 시작합니다.
Return Value가 유효한지 확인합니다. 유효하면 그 컴포넌트를 Target으로 Set Niagara Variable (Float)를 호출해 User.ImpactStrength를 전달하고 Activate합니다. 유효하지 않을 경우에도 게임플레이의 충돌 처리는 진행되어야 합니다.
효과 처리 뒤 발사체를 Destroy Actor합니다. 컴파일·저장 후 발사 경로에서 테스트하고 강도 0, 0.5, 1에 대해 생성 수 0, 50, 100을 예상 기준으로 비교합니다. 발사체를 먼저 파괴한 뒤 잠재 실행 경로에 의존하지 않습니다.
실패 지점 분리
효과가 보이지 않으면 Hit 발생 여부 → Spawn 반환값 → User 이름/타입 → Burst와 활성화 순서 → 머티리얼·Bounds 순서로 확인합니다. 잘못된 방향은 Impact Normal, 시스템의 로컬 +Z, 초기 속도 공간을 비교합니다. 효과가 남으면 개별 Lifetime뿐 아니라 Emitter/System 완료와 Auto Destroy를 확인합니다.
이 흐름은 Blueprint 사건이 시스템을 생성하는 방식입니다. Niagara 내부 Event Handler가 Blueprint의 임의 페이로드를 자동 수신하는 구조와 혼동하지 않습니다. 반복되는 많은 충격에는 내장 풀링이나 Data Channels를 별도로 비교하되 반환된 컴포넌트의 수명 규칙을 지킵니다.