정적 메시와의 기본 콜리전
Collision 모듈과 Distance Field를 이용해 파티클이 정적 메시를 감지하고 바닥에서 반사·마찰·소멸하도록 설정합니다.
파티클이 바닥에서 튕기거나 벽에 닿아 사라지게 하려면 충돌 감지와 반응을 설정해야 합니다. Niagara Collision은 시각 효과를 위한 근사이며 게임의 명중·피해 판정은 별도 게임플레이 로직으로 처리합니다.
먼저 시뮬레이션 경로 선택하기
Static Mesh는 메시 에셋 종류이며 반드시 움직이지 않는다는 뜻은 아닙니다. 이 절에서는 움직이지 않는 바닥 메시를 기준으로 시작합니다.
| 경로 | 읽는 표면 | 확인할 제한 |
|---|---|---|
| CPU Collision | 월드에 대한 trace | 대상 컴포넌트의 query collision과 trace 채널 응답, 입자 수에 따른 CPU 비용 |
| GPU Scene Depth | 현재 렌더된 깊이 | 화면 밖·가려진 표면 정보와 카메라 변화에 의존 |
| GPU Distance Fields | 전역 거리 필드 | 거리 필드 생성·지원 플랫폼·얇은 표면과 해상도 오차 |
하나의 Collision Mode 목록에서 Trace, Static Mesh, Landscape를 서로 같은 선택지로 고르는 구조로 이해하지 않습니다. 모듈에 노출되는 항목은 Sim Target과 버전에 따라 다릅니다. GPU Ray Traces 같은 추가 기능은 별도의 지원 조건을 확인합니다.
Particle Update 모듈 참조에 따라 기본 Collision은 Solve Forces and Velocity 바로 앞에 둡니다.
충돌 반응값
- Restitution: 표면 법선 방향의 반발을 조절합니다. 0은 법선 방향 반발이 없는 상태이지 모든 접선 이동이 즉시 0이 된다는 뜻은 아닙니다. 1도 중력·저항·다른 손실까지 없애지는 않습니다.
- Friction: 접선 방향 미끄러짐의 감쇠에 관여합니다. 정확한 범위와 반응은 모듈 버전 및 solver 조건을 확인합니다.
- Collision Radius: 보이는 Sprite/메시와 충돌 근사가 맞는지 조절합니다. Sprite Size는 전체 폭·높이이므로 반경과 같은 숫자가 아닙니다. 모든 메시가 자동으로 정확한 바운딩 박스 충돌을 사용하는 것도 아닙니다.
- 종료 조건: 충돌 후 제거가 필요하면 모듈의 kill 설정 또는 충돌 결과를 사용하는 Kill Particles를 구성합니다. 버전에 없는 Max Collisions 필드에 의존하지 말고, 반복 횟수가 필요하면 실제 제공되는 충돌 카운트/상태와 수명 제한을 확인합니다.
Distance Field 준비
Project Settings의 Rendering에서 Generate Mesh Distance Fields를 검색해 켭니다. 에디터가 요구하는 재시작과 데이터 생성이 완료되도록 합니다.
거리 필드 시각화에서 대상 바닥의 표면이 표현되는지 확인합니다. 너무 얇은 면, 작은 세부 형상, 비균일 스케일은 근사 오차를 만들 수 있습니다. 무조건 가장 정확한 충돌 방식이라고 보지 않습니다.
GPU 이미터의 Collision에서 Distance Fields 경로를 선택합니다. CPU trace와 비교하려면 Sim Target과 충돌 설정을 함께 바꾸며 두 경로의 대상 데이터가 다름을 기록합니다.
직접 해보기: 바닥에서 튕기는 파티클
기본 Sprite 시스템을 복제해 NS_BouncingParticles로 저장합니다. Emitter State는 계속 재생되게 하고 Emitter Update에 Spawn Rate를 둡니다. 처음에는 20개/초처럼 소수로 시작합니다.
Particle Spawn의 Initialize Particle에서 Lifetime 2초, Sprite Size 10 cm, 밝은 Color를 설정합니다. Add Velocity도 Particle Spawn에 두고 Z=300 cm/s, X/Y는 각각 -50~50 cm/s 범위로 정합니다.
Particle Update에 Particle State, Gravity Force, Collision, Solve Forces and Velocity를 둡니다. Gravity Force는 아래 방향 가속도 (0,0,-980) cm/s²를 기준으로 하고 Collision은 solver 바로 앞에 둡니다.
우선 CPU Sim으로 두고 Collision의 trace 채널에 대해 바닥이 Block 응답을 하도록 설정합니다. Restitution 0.7, Friction 0.5부터 시작하고 반경은 10 cm 폭 Sprite에 대해 약 5 cm를 기준으로 시각 크기와 비교합니다. 충돌 즉시 제거하는 설정은 끕니다.
시스템을 바닥에서 약 100 cm 위에 배치합니다. 단순하고 충분히 두꺼운 바닥에서 재생해 반발과 미끄러짐을 각각 확인합니다. Particle State에서 수명 종료 시 제거되게 합니다.
기본 반응이 맞으면 복사본을 GPU Compute Sim으로 바꾸고 위에서 준비한 Distance Fields 경로를 적용합니다. 움직임이 들어갈 Bounds를 설정하고, 화면 밖과 얇은 표면에서 차이를 비교합니다.
예상 결과는 상승 후 낙하하고 표면에서 반발하는 움직임입니다. 지속적인 중력이 있으므로 저항·충돌 반응·수명 설정에 따라 완전히 멈추기 전에 제거될 수도 있습니다. 감지 자체가 실패하면 반발값보다 표면 데이터와 반경부터 확인합니다.
충돌 이벤트와 비용
CPU 파티클의 충돌을 다른 이미터에 전달하려면 별도 Generate Collision Event와 수신 이미터의 Event Handler/Receive Collision Event를 구성합니다. 소스의 Persistent IDs와 CPU 이벤트 지원을 확인합니다. Event Handler는 임의의 Blueprint 이벤트나 사운드 호출을 자동 실행하는 인터페이스가 아닙니다. 게임플레이 Hit, Niagara 데이터 내보내기, 오디오 기능은 각각의 전달 경로가 필요합니다.
충돌하는 동시 입자 수·수명·조회 범위를 줄이고 실제 장면에서 비용을 측정합니다. 눈에 잘 띄는 핵심 파편만 충돌시키거나 첫 충돌 후 제거하는 설계도 비교합니다.