이펙트 (FX)/이펙트 팁 : Unreal

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

Minkyu Lee 2025. 8. 14. 18:54

개요

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

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

 

내용

핵심은 시퀀서가 시간을 다루는 방식(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로 캐싱 재생