발자국, 물튀김과 같은 이펙트
애니메이션 노티파이와 충돌 이벤트에서 지면 재질·위치·속도를 전달해 발자국 먼지와 물 튀김 효과를 스폰합니다.
이전 절에서는 불꽃, 연기, 폭발과 같은 비교적 독립적인 파티클 이펙트 제작의 기본 원리를 살펴보았습니다.
이제는 게임 월드나 플레이어의 행동과 더욱 밀접하게 연관되는, 즉 게임플레이 요소에 반응하는 섬세한 파티클 이펙트를 만드는 방법에 대해 알아보겠습니다.
대표적인 예시가 바로 발자국(Footstep) 효과와 물 튀김(Water Splash) 효과입니다.
이러한 이펙트들은 단순히 시각적인 정보를 제공하는 것을 넘어, 플레이어가 걷는 지면의 재질(흙, 물, 눈 등)이나 오브젝트의 상호작용(물 속으로 떨어지는 물체)에 따라 동적으로 변화해야 하므로, 나이아가라 시스템과 블루프린트의 긴밀한 연동이 필수적입니다.
발자국 이펙트 제작
발자국 이펙트는 캐릭터가 지면을 밟을 때 발생하는 먼지, 흙먼지, 눈 발자국, 물 튀김 등 다양한 형태를 가집니다.
핵심은 캐릭터의 발이 지면에 닿는 정확한 시점과 위치에 파티클을 스폰하는 것입니다.
발자국 이펙트 나이아가라 시스템
먼저, 발자국 이펙트에 사용될 나이아가라 시스템을 만듭니다.
새 나이아가라 시스템 생성: New system from selected emitters > Fountain 템플릿을 사용하여 NS_FootstepDust와 같은 이름으로 생성합니다.
Emitter UpdateSpawn Rate모듈을 제거합니다. (이 시스템은 한 번의 Burst로 입자를 생성합니다)- 사용자 변수 노출:
Parameters패널의User섹션에서+버튼을 클릭하고Add User Parameter>Float를 선택하여User.ImpactForce(발을 딛는 힘의 정도)를 만듭니다. (기본값 1.0) +버튼을 클릭하고Add User Parameter>Vector를 선택하여User.GroundNormal(지면의 노멀 방향)을 만듭니다. (기본값 (0,0,1))
Initialize Particle 모듈Lifetime:0.5~1.0(짧게 설정)Sprite Size:5.0~15.0(작은 먼지 효과에 적합)Color: 지면 재질에 맞는 색상 (예: 흙먼지는 갈색, 눈은 흰색)
Add Velocity 모듈Velocity를Cone형태로 설정하고, 축을 월드 공간의User.GroundNormal에 연결하여 파티클이 지면에서 위로 퍼지도록 합니다.Speed에는100 × Clamp(User.ImpactForce, 0, 2)cm/s처럼 단위를 정한 입력을 연결합니다. 시스템은 World Space로 두고 Spawn 회전은 0으로 사용해 법선을 이중 회전하지 않습니다.
Particle Update 섹션Gravity Force: 약하게 적용하여 먼지가 천천히 가라앉도록 합니다.Drag: 강하게 적용하여 먼지가 빠르게 감속하고 사라지도록 합니다.Curl Noise Force: 약하게 적용하여 먼지의 흐름에 미세한 불규칙성을 줍니다.Collision:Collision모듈을 추가하고 충돌 후 kill하는 응답을 선택합니다. 충돌로 죽는 입자에는 반발·마찰 튜닝이 중요하지 않습니다. 사용하는 CPU/GPU 충돌 방식의 지원을 확인하고 Collision을Solve Forces and Velocity바로 앞에 둡니다.
Spawn Burst Instantaneous 모듈 추가Emitter Update섹션에서Spawn Burst Instantaneous모듈을 추가합니다.Spawn Count는Clamp(Round(10 × User.ImpactForce), 0, 20)정수로 설정합니다. Burst Time은 0, Emitter State는 Once로 두고 Particle State가 수명 종료 후 입자를 제거하도록 합니다.
Sprite Renderer를 사용하고, 먼지/연기 텍스처를 가진Translucent머티리얼을 할당합니다.- 머티리얼 Opacity에
DepthFade를 적용해 표면과 만나는 경계를 완화합니다.
시스템을 저장합니다.
애니메이션 노티파이에서 표면 조회
캐릭터 블루프린트에서 발이 지면에 닿는 애니메이션 프레임에 맞춰 파티클을 스폰합니다.
이는 애니메이션 노티파이(Animation Notify)를 활용하는 것이 일반적입니다.
캐릭터 애니메이션 시퀀스/몽타주 열기: 캐릭터의 걷기/달리기 애니메이션 시퀀스 또는 애니메이션 몽타주를 엽니다.
- 단순 고정 효과는
Add Notify > Play Niagara Particle Effect에서 Niagara System과 발 소켓을 지정할 수 있습니다. Cascade용 Play Particle Effect와 구분합니다. - 표면별 분기에는
AnimNotify를 부모로 하는 Blueprint(예:BP_AnimNotify_Footstep)를 만들고 애니메이션 트랙에 배치합니다.Received Notify에서 전달된 Mesh Component의 발 소켓 위치를 구합니다. - 발 위에서 아래로 Line Trace By Channel을 수행하고 자기 캐릭터를 제외합니다. Blocking Hit가 있을 때만 Impact Point·Impact Normal과 Physical Material의 Surface Type을 읽습니다. 지면 머티리얼·충돌 설정도 해당 정보를 반환하도록 구성해야 합니다.
- 흙·눈·물에 맞는 Niagara System을 선택합니다. 눌린 발자국 Decal의 수명은 순간 먼지와 따로 정합니다.
- Mesh Component의 Owner에서 속도를 읽고 수평 속도를 기준으로
ImpactForce = Clamp(Speed / 300, 0, 2)를 계산합니다. 이것은 물리 힘이 아니라 강도 배율입니다. Spawn System at Location: Location은 Impact Point에서 법선 방향으로 약간 띄우고, Rotation은 0, Auto Activate는 false로 둡니다.- 반환 컴포넌트가 유효한지 확인한 뒤
Set Niagara Variable (Float)로User.ImpactForce, Vector 설정으로User.GroundNormal을 전달하고 마지막에Activate합니다. Spawn 노드에 임의 Parameters 핀이나 Make Niagara System Spawn Info를 붙이지 않습니다.
블루프린트와 애니메이션을 저장하고 게임을 플레이하여 캐릭터가 걸을 때마다 발밑에서 먼지가 발생하는지 확인합니다.
물 튀김 이펙트 제작
물 튀김 이펙트는 물방울이 튀는 표면의 특성(예: 깊이, 물체의 속도)에 따라 다르게 나타납니다.
물 표면 진입 이벤트로 Sprite 물방울을 만드는 예제입니다. Niagara Collision의 범용 Fluid 응답이나 실제 유체 시뮬레이션을 전제로 하지 않습니다.
물 튀김 이펙트 나이아가라 시스템
새 나이아가라 시스템 생성: New system from selected emitters > Fountain 템플릿을 사용하여 NS_WaterSplash와 같은 이름으로 생성합니다.
Emitter UpdateSpawn Rate모듈을 제거합니다.-
사용자 변수 노출
User.SplashIntensity(Float, 물 튀김 강도)User.SurfaceNormal(Vector, 물 표면의 노멀)
Initialize Particle 모듈Lifetime:0.5~1.5(짧게)Sprite Size:5.0~20.0(물방울 크기)Color: 물색 (하늘색, 파란색)- 초기 속도는 Particle Spawn의
Add Velocity에서 Cone으로 설정합니다. World Space의User.SurfaceNormal을 축으로 하고, Speed는200 × Clamp(User.SplashIntensity, 0, 2)cm/s로 둡니다.
Particle Update 섹션Gravity Force: 강하게 적용하여 물방울이 빠르게 떨어지도록 합니다.Drag: 약하게 적용하여 물방울이 공기 저항으로 인해 너무 빨리 멈추지 않도록 합니다.Collision:Collision모듈을 추가합니다.- CPU는 trace, GPU는 지원되는 Scene Depth/Distance Field 등 방식 중 하나를 선택합니다. 두 타깃의 옵션을 같은 메뉴로 취급하지 않습니다.
- 충돌 후 kill 응답을 사용한다면 반발·마찰 값보다 충돌 감지가 중요합니다. 물 표면이 해당 충돌 입력에 존재하는지도 확인합니다.
Solve Forces and Velocity를 Collision 바로 뒤에 두고 Particle State가 Lifetime 종료를 처리하도록 합니다.
Spawn Burst Instantaneous 모듈 추가Spawn Count = Clamp(Round(20 × User.SplashIntensity), 0, 40)으로 정수 개수를 제한합니다. Burst Time 0, Emitter State Once로 한 번만 발생시킵니다.
Sprite RendererMaterial: 물방울 텍스처를 가진Translucent또는Additive블렌드 모드,Unlit셰이딩 모델을 사용합니다.
시스템을 저장합니다.
블루프린트에서 물 튀김 스폰
물체가 물에 잠기는 경우에는 막는 벽처럼 동작하는 Blocking Volume보다 물 영역의 Overlap과 별도 표면 조회를 사용할 수 있습니다. 아래 예시는 수평 수면 Z가 알려진 경우입니다.
물 영역 컴포넌트의 Overlap 응답과 Generate Overlap Events를 맞추고, 물 영역 참조 또는 인터페이스로 대상을 식별합니다.
BP_ThrowableRock의 Begin Overlap에서 물 영역 진입을 확인합니다. 여러 컴포넌트가 겹쳐도 같은 진입에 한 번만 발생하도록 상태를 저장하고 영역을 완전히 나간 뒤 초기화합니다.
물체 위치의 X/Y와 수면 Z로 표면 위치를 정하고 Surface Normal은 (0,0,1)로 둡니다. 실제 물 시스템을 사용한다면 그 시스템의 표면 높이·법선 질의 결과로 바꿉니다. 일반 Overlap의 Sweep Result가 항상 유효한 Impact Point를 제공한다고 가정하지 않습니다.
진입 속도의 아래 방향 성분으로 SplashIntensity = Clamp(Max(0, -Velocity.Z) / 500, 0, 2)를 계산합니다. Spawn System at Location의 Auto Activate를 false로 두고 반환 컴포넌트에 User.SplashIntensity와 User.SurfaceNormal을 설정한 뒤 Activate합니다.
저장·컴파일 후 느린 진입과 빠른 낙하, 재진입을 비교합니다. 실제 실행 전에는 위 값에 따른 개수·높이를 예상값으로만 취급합니다.
막힌 표면의 Hit를 사용하는 다른 구성에서는 Other Comp와 Impact Point·Normal을 확인합니다. Component Hit의 Hit Component는 이벤트 소유 컴포넌트입니다. Hit에는 일반적인 Velocity 출력 핀이 없고, sweep 충돌의 Normal Impulse는 0일 수 있으므로 필요하면 충돌 직전 속도를 저장합니다.
성능 최적화 (발자국/물 튀김)
이러한 이펙트들은 자주 발생할 수 있으므로, 최적화가 더욱 중요합니다.
- 짧은
Lifetime: 파티클의 수명을 최대한 짧게 유지하여 동시에 활성화되는 파티클 수를 줄입니다. - 낮은
Spawn Count: 시각적 품질을 해치지 않는 선에서Spawn Burst의 수를 최소화합니다. - 간단한 머티리얼:
Unlit&Translucent또는Additive블렌드 모드의 간단한 텍스처 머티리얼을 사용합니다. Collision최소화:Collision모듈의 복잡한 설정을 피하고, 해당 모듈의 충돌 후 kill 응답을 사용하거나 충돌이 불필요한 입자에서는 모듈을 제거합니다.- 오브젝트 풀링: 매우 자주 발생하는 효과(예: 발자국)의 경우, Spawn 노드의 내장
Pooling Method를 먼저 검토합니다. 자동 회수되는 컴포넌트 참조를 완료 후 재사용하지 않으며, 한 번 재생되는 시스템이 실제 완료되는지 확인합니다.
두 효과 모두 표면 위치·법선·강도를 먼저 결정하고, 값을 설정한 컴포넌트를 활성화합니다. 발은 접지 Notify, 물은 영역 진입이라는 서로 다른 트리거를 사용하므로 공중 보행·중복 Overlap·기본 표면 타입도 함께 확인합니다.
노티파이 종류는 Epic Niagara Quick Start, 스폰 입력은 Spawn System at Location을 참고합니다.