본문 바로가기
이펙트 (FX)/이펙트 팁 : Unreal

[Unreal/Niagara] 시퀀서에서 나이아가라 Collision 모듈 충돌 오류 해결법

by Minkyu Lee 2025. 8. 14.

개요

인게임 플레이시에는 충돌 처리 문제가 없다가,

시퀀서에서 나이아가라 충돌 모듈이 오류를 일으키는 경우 해결법이다.

 

내용

핵심은 시퀀서가 시간을 다루는 방식(Desired Age/Seek, 비실시간 델타타임, 일시정지 등) 때문에

충돌 쿼리/보정(substep)이 건너뛰어지거나 부정확해지는 데 있다. 

따라서 시스템 라이프 사이클 세팅이 큰 원인이다.

 

해결법

Desired Age 대신 Tick Delta Time, 또는 Desired Age No Seek 사용



Seek이란?

타임라인의 특정 시점으로 “점프(Seek)”하는 것을 말한다.

이때 나이아가라를 빠르게 시뮬레이션하면서 많은 프레임을 큰 델타로 건너뛴다.

 

해결법 상세

🧠 문제 이해

  • ⚙️ 나이아가라 이펙트: Collision 모듈에서 Ray Trace(트레이스/라인 트레이스 기반) 사용
  • 🎮 게임 플레이: 정상 충돌
  • 🎬 시퀀서 재생: 지면을 관통 후 하강

🤔 왜 그럴까? (원인 후보)

  • 🧭 Age Update Mode(Desired Age/Seek) 문제
    시퀀서는 타임라인의 특정 시점으로 “점프(Seek)”하면서 나이아가라를 빠르게 재현(sim) 하는데, 이 때 많은 프레임을 큰 델타로 건너뜁니다.

  • ⏱️ 큰 ΔTime & 서브스텝 부족
    시퀀서는 종종 비실시간(예: 30→1프레임 점프)으로 평가합니다. 충돌 모듈에 서브스텝/최대 스텝 수가 부족하면 입자가 바닥 아래로 통과합니다.

🛠️ 바로 적용할 해결책 (우선순위)

✅ 1) 시퀀서의 나이아가라 “Age Update Mode”를 바꾸기 (가장 효과적)

  • 🎛️ Niagara 트랙 선택 → 트랙 속성(Properties)
    Age Update Mode
    • Tick Delta Time (권장) 으로 변경
      → 시퀀서도 게임과 같은 방식으로 매 프레임을 틱하며 충돌이 안정적으로 작동
    • 또는 Desired Age (No Seek)
      → 시간 점프 시 재시뮬(Seek) 하지 않아서 충돌 스킵이 크게 줄어듭니다.
  • 💡 “Desired Age”를 꼭 써야 한다면, Seek Delta아주 작게(예: 0.0083~0.016s) 설정해 서브스텝 효과를 만드세요.

✅ 2) 나이아가라 시스템/모듈의 서브스텝 & 델타 제한 강화

  • 🧩 System/Emitter 설정에서
    • 고정 ΔTime(예: 1/60) 또는 Max Tick ΔTime(클램프) 값을 설정
    • Determinism 활성화 시 Fixed Tick Delta Time 도 함께 설정
  • 🧲 Collision 모듈에서
    • 서브스텝/최대 스텝 수/최대 반복 횟수(이름은 버전마다 다름: Max Substeps, Max Iterations, Step Size 등)를 상향
    • Sweep/Continuous 방식(지원 시) 사용
    • 반발/마찰 값 조정으로 재침투 최소화
  • 💡 큰 중력/속도면 Max Speed/Accel 제한을 걸어 터널링 완화

✅ 3) “Pause 중에도 Tick” 허용

  • 🧩 NiagaraComponent 선택 → Details
    • Tick Even When Paused 체크 (컴포넌트)
  • 🧑‍💻 C++일 경우:→ 시퀀서가 월드를 일시정지로 평가해도 충돌/트레이스가 정상 평가됩니다.
  • NiagaraComp->PrimaryComponentTick.bTickEvenWhenPaused = true; // (필요시) 액터에도 PrimaryActorTick.bTickEvenWhenPaused = true;

✅ 4) 충돌 방식 검토 (혼용 시 주의)

  • 🧪 Ray Trace(라인 트레이스) 만 쓰는 게 목표라면 계속 사용하되,
    • Trace 채널/프로파일 이 지면 메시와 맞는지 재확인 (Query Enabled, Block?)
    • Draw Debug 옵션으로 실제 히트 확인
  • 🧊 Scene Depth 기반 충돌을 일부라도 섞었다면 → Distance Field 또는 Ray Trace 로 통일 권장
    • Project Settings → Rendering → Generate Mesh Distance Fields 활성화
    • 지면 메시 Affect Distance Field 켜기

✅ 5) (시네마틱 최상 안정) Sim Cache 사용

  • 🧷 Niagara System 에디터 → Toolbar: Sim Cache → New Cache 생성 & Bake
    • 필요 시 Warmup 설정 포함
  • 🎬 시퀀서에서 해당 Sim Cache 트랙을 추가/할당
    → 실제 플레이에서 충돌 포함한 결과를 캐싱하고, 시퀀서는 캐시만 재생하므로 프레임/시킹/일시정지 영향을 제거.
    → 무결성 최고, 렌더에도 강력 추천 ✔️

🔎 추가 체크리스트 (디버깅 팁)

  • 🧭 Niagara 트랙 → Play Rate 가 1.0인지 확인 (비정상 배속은 터널링 유발)
  • 🧱 Ground Mesh 충돌 세팅: Collision Enabled(Queries), 적절한 채널 Block
  • 🧪 라인 트레이스 디버그: Niagara CollisionQuery/Trace 모듈의 Debug Draw 켜서 히트여부 확인
  • 🌍 레벨 스트리밍/월드 파티션: 시퀀서 평가 시 지면 레벨이 로드/Visible 상태인지
  • 📦 Emitter 타입: Ray Trace는 CPU 시뮬레이션에서만 정상. GPU Emitter에선 동일 방식 적용X
  • 🧭 Bounds: Niagara Fixed Bounds 설정(너무 타이트하면 시퀀서 카메라/포커싱에서 컬링될 수 있음)
  • 🎞️ Movie Render Queue 사용 시
    • Game Overrides → Use Fixed Time Step (예: 1/60)
    • 또는 Sim Cache로 확정 후 렌더

📦 시네마틱-안정 워크플로 (추천)

  • 💡 개발 중엔: Age Update Mode = Tick Delta Time + 충돌 서브스텝 상향 + Tick Even When Paused
  • 🎥 최종 렌더 전엔: Sim Cache로 굳히기 (한 번 베이크 → 어떤 재생/렌더 조건에서도 동일 결과)

📋 요약

  • 원인: 시퀀서의 시간 “Seek/비실시간 델타/일시정지”로 인해 충돌 쿼리·서브스텝이 건너뛰어져 바닥을 놓침
  • 해결:
    • Age Update Mode = Tick Delta Time (또는 Desired Age No-Seek)
    • Seek Delta 축소 + 고정 ΔTime/서브스텝 강화
    • Tick Even When Paused 활성화
    • (옵션) 충돌을 Distance Field/Trace로 일원화
    • (최종) Sim Cache로 캐싱 재생

 

댓글