발자국, 물튀김과 같은 이펙트
애니메이션 노티파이와 충돌 이벤트에서 지면 재질·위치·속도를 전달해 발자국 먼지와 물 튀김 효과를 스폰합니다.
이전 절에서는 불꽃, 연기, 폭발과 같은 비교적 독립적인 파티클 이펙트 제작의 기본 원리를 살펴보았습니다.
이제는 게임 월드나 플레이어의 행동과 더욱 밀접하게 연관되는, 즉 게임플레이 요소에 반응하는 섬세한 파티클 이펙트를 만드는 방법에 대해 알아보겠습니다.
대표적인 예시가 바로 발자국(Footstep) 효과와 물 튀김(Water Splash) 효과입니다.
이러한 이펙트들은 단순히 시각적인 정보를 제공하는 것을 넘어, 플레이어가 걷는 지면의 재질(흙, 물, 눈 등)이나 오브젝트의 상호작용(물 속으로 떨어지는 물체)에 따라 동적으로 변화해야 하므로, 나이아가라 시스템과 블루프린트의 긴밀한 연동이 필수적입니다.
발자국과 물튀김은 단독 재생 이펙트보다 게임 상태와 더 강하게 묶입니다. 발 위치, 표면 타입, 이동 속도를 받아 스폰 위치와 입자 수명을 조절합니다.
- 발 접촉 이벤트와 표면 타입 분기
발자국 이펙트는 먼지, 흙먼지, 눈 눌림, 물 튀김처럼 표면 재질에 따라 다른 스폰 규칙을 가집니다. 2 물 튀김 이펙트는 물방울이 튀는 표면의 특성(예: 깊이, 물체의 속도)에 따라 다르게 나타납니다. 3 발자국과 물 튀김은 반복 발생하므로 스폰 빈도, 카메라 거리, 표면별 LOD를 함께 제한합니다. 4 발자국 이펙트는 발이 지면에 닿는 시점과 위치에 맞춰 Niagara System을 스폰합니다.
- 발자국 이펙트 제작
발자국 이펙트는 먼지, 흙먼지, 눈 눌림, 물 튀김처럼 표면 재질에 따라 다른 스폰 규칙을 가집니다.
- 물 튀김 이펙트 제작
물 튀김 이펙트는 물방울이 튀는 표면의 특성(예: 깊이, 물체의 속도)에 따라 다르게 나타납니다.
- 성능 최적화 (발자국/물 튀김)
발자국과 물 튀김은 반복 발생하므로 스폰 빈도, 카메라 거리, 표면별 LOD를 함께 제한합니다.
- 발자국 이펙트 나이아가라 시스템
발자국 이펙트는 발이 지면에 닿는 시점과 위치에 맞춰 Niagara System을 스폰합니다.
- 발자국·물튀김 스폰 검수
발 위치, Physical Material, 이동 속도를 사용자 파라미터로 넘겨 표면별 이펙트를 안정적으로 분기합니다. Anim Notify 또는 발 접촉 이벤트에서 표면 타입을 읽고 먼지, 눈, 젖은 바닥용 시스템을 분기합니다. 충돌 속도와 물 깊이를 사용자 파라미터로 넘겨 스플래시 높이와 수명을 과장 없이 맞춥니다.
발자국 이펙트 제작
캐릭터 보행 이벤트가 표면 타입, 속도, 노멀 방향을 거쳐 먼지, 물 튐, 눈 자국 같은 발자국 VFX로 분기되는 흐름을 정리한다.
- 1Notify 발생
발이 지면에 닿는 프레임에서 애님 노티파이가 위치와 발 구분을 전달한다. foot contact
- 2표면 조회
아래 방향 trace로 충돌 지점, 노멀, Physical Material을 얻는다. line trace
- 3이펙트 선택
흙, 금속, 물, 눈 같은 표면 타입별 Niagara System과 decal을 고른다. surface routing
- 4강도 조절
캐릭터 속도와 낙하 여부로 spawn rate, 색, 크기, 사운드 볼륨을 조정한다. parameter scale
발자국 이펙트는 캐릭터가 지면을 밟을 때 발생하는 먼지, 흙먼지, 눈 발자국, 물 튀김 등 다양한 형태를 가집니다.
핵심은 캐릭터의 발이 지면에 닿는 정확한 시점과 위치에 파티클을 스폰하는 것입니다.
발자국 이펙트 나이아가라 시스템
먼저, 발자국 이펙트에 사용될 나이아가라 시스템을 만듭니다.
새 나이아가라 시스템 생성: New system from selected emitters > Fountain 템플릿을 사용하여 NS_FootstepDust와 같은 이름으로 생성합니다.
Emitter UpdateSpawn Rate모듈을 제거합니다. (블루프린트에서 버스트 스폰할 것이므로)- 사용자 변수 노출:
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또는Sphere형태로 설정하고,Cone Axis를User.GroundNormal로 연결하여 파티클이 지면에서 위로 퍼지도록 합니다.Speed나Radius입력에Get Parameter(User.ImpactForce) 노드를 연결하여 발을 딛는 힘에 따라 파티클이 퍼지는 속도를 조절합니다.
Particle Update 섹션Add Gravity Force: 약하게 적용하여 먼지가 천천히 가라앉도록 합니다.Drag: 강하게 적용하여 먼지가 빠르게 감속하고 사라지도록 합니다.Noise Force: 약하게 적용하여 먼지의 흐름에 미세한 불규칙성을 줍니다.Collision:Collision모듈을 추가하고Kill On Collision을 활성화하여 먼지가 지면에 닿으면 즉시 사라지도록 합니다.Restitution은0.0,Friction은1.0으로 설정합니다.
Spawn Burst Instantaneous 모듈 추가Emitter Update섹션에서Spawn Burst Instantaneous모듈을 추가합니다.Spawn Count입력에Get Parameter(User.ImpactForce) 노드를 연결하고 원하는 계수를 곱하여 발을 딛는 힘에 따라 먼지 파티클 수가 조절되도록 합니다.
Sprite Renderer를 사용하고, 먼지/연기 텍스처를 가진Translucent머티리얼을 할당합니다.Soft Particle을 활성화합니다.
시스템을 저장합니다.
캐릭터 블루프린트 설정합니다
캐릭터 블루프린트에서 발이 지면에 닿는 애니메이션 프레임에 맞춰 파티클을 스폰합니다.
이는 애니메이션 노티파이(Animation Notify)를 활용하는 것이 일반적입니다.
캐릭터 애니메이션 시퀀스/몽타주 열기: 캐릭터의 걷기/달리기 애니메이션 시퀀스 또는 애니메이션 몽타주를 엽니다.
Notify트랙을 추가하거나 기존 트랙을 사용합니다.- 발이 지면에 닿는 정확한 프레임에서 우클릭하고
Add Notify>PlayParticleEffect(기본 제공 노티파이) 또는New Notify>Sound,Blueprint등 원하는 유형의 커스텀 노티파이를 추가합니다. PlayParticleEffect를 사용할 경우Niagara System속성에 위에서 만든NS_FootstepDust를 할당합니다.Location,Rotation,Socket Name등을 설정합니다. (발 소켓에 부착)- 추천: 보다 정밀한 제어를 위해
New Notify>Blueprint Notify를 생성합니다. (예:BP_AnimNotify_Footstep)- 새로 만든 블루프린트 노티파이(
BP_AnimNotify_Footstep)를 열고Received_Notify이벤트를 오버라이드합니다. - 이 이벤트에서 라인 트레이스 바이 채널(Line Trace By Channel) 노드를 사용하여 발 아래 지면의 정보를 가져옵니다. (Start: 발 소켓 위치, End: 발 소켓 아래로 조금 내려간 위치)
- 라인 트레이스 결과(
Hit Result)에서Impact Point(충돌 지점)와Impact Normal(충돌 표면 노멀)을 가져옵니다. Spawn System at Location노드를 사용하여NS_FootstepDust를 스폰합니다.Location핀에Impact Point를 연결합니다.Rotation핀에Make Rot From Z노드를 연결하고Impact Normal을Z입력에 연결합니다.Parameters핀을 활성화하고Make Niagara System Spawn Info노드를 추가합니다.User.ImpactForce변수에 캐릭터의 속도(예:Get Velocity노드의Vector Length결과)를 연결하여 속도에 따라 먼지 강도를 조절합니다.User.GroundNormal변수에Impact Normal을 연결합니다.
- 새로 만든 블루프린트 노티파이(
블루프린트와 애니메이션을 저장하고 게임을 플레이하여 캐릭터가 걸을 때마다 발밑에서 먼지가 발생하는지 확인합니다.
물 튀김 이펙트 제작
반응형 물 효과는 표면 히트 정보에서 시작해 짧은 burst, 중력, 알파 감쇠, 머티리얼 표현으로 이어진다.
| 구간 | 입력 | Niagara 처리 | 확인 포인트 |
|---|---|---|---|
| Hit | Impact Point, Normal, Surface Type | 스폰 위치와 방향 결정 | 표면 방향이 맞는가 |
| Burst | 충돌 강도와 물량 | Spawn Burst Count | 충격 강도와 개수가 비례하는가 |
| Motion | 상향 속도, 중력, Drag | Velocity, Gravity Force | 포물선이 자연스러운가 |
| Look | Sprite/mesh, 물 머티리얼 | Translucent, Normal, Opacity | 물방울처럼 보이는가 |
| Fade | Lifetime, alpha curve | 수명 후 사라짐 | 바닥에 잔상이 남지 않는가 |
물 튀김 이펙트는 물방울이 튀는 표면의 특성(예: 깊이, 물체의 속도)에 따라 다르게 나타납니다.
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: 물색 (하늘색, 파란색)Initial Velocity:Add Velocity모듈에서Cone형태로User.SurfaceNormal방향으로 퍼지게 합니다.Speed를User.SplashIntensity에 비례하게 설정합니다.
Particle Update 섹션Add Gravity Force: 강하게 적용하여 물방울이 빠르게 떨어지도록 합니다.Drag: 약하게 적용하여 물방울이 공기 저항으로 인해 너무 빨리 멈추지 않도록 합니다.Collision:Collision모듈을 추가합니다.Collision Mode:Distance Field또는TraceKill On Collision: 활성화 (물방울이 표면에 닿으면 사라짐)Restitution:0.0(튕기지 않음)Friction:1.0(닿으면 바로 멈춤)
Spawn Burst Instantaneous 모듈 추가Spawn Count입력에Get Parameter(User.SplashIntensity) 노드를 연결하고 적절한 계수를 곱하여 강도에 따라 물방울 수가 조절되도록 합니다.
Sprite RendererMaterial: 물방울 텍스처를 가진Translucent또는Additive블렌드 모드,Unlit셰이딩 모델을 사용합니다.
시스템을 저장합니다.
블루프린트에서 물 튀김 스폰
물속으로 들어가는 오브젝트(예: 던진 돌, 캐릭터 점프)의 On Component Hit 또는 On Component Begin Overlap 이벤트에서 Spawn System at Location 또는 Spawn System Attached를 사용합니다.
물체가 떨어지는 물의 Blocking Volume 또는 Static Mesh 컴포넌트를 준비합니다.
물체 블루프린트 (예: BP_ThrowableRock)를 엽니다.
물체의 Collision Component를 선택하고 On Component Hit 이벤트를 추가합니다.
Event Hit 노드에서 실행 핀을 연결하여 다음 노드를 추가합니다.
Hit이벤트의Hit Component가 물을 나타내는 컴포넌트인지Cast To또는Equal노드로 확인합니다.- 조건이 참일 경우
Spawn System at Location노드를 사용합니다. Niagara System:NS_WaterSplash할당.Location:Hit Location(충돌 지점)Rotation:Make Rot From Z노드에Hit Normal을 연결하여 물 표면에 수직으로 스폰.-
Parameters핀 활성화Make Niagara System Spawn Info노드를 추가합니다.User.SplashIntensity(Float)에Hit이벤트의Normal Impulse또는Hit이벤트의Velocity(물체가 충돌한 속도)의Vector Length값을 연결합니다. (Map Range Clamped로 적절히 스케일링)User.SurfaceNormal(Vector)에Hit Normal을 연결합니다.
블루프린트를 컴파일하고 저장한 뒤 게임을 플레이하여 물체가 물에 닿을 때 물 튀김이 발생하는지 확인합니다.
발자국과 물 튀김은 트리거 소스만 다를 뿐, 표면 조회, 강도 계산, 사용자 파라미터 전달, 짧은 수명과 충돌 종료라는 같은 검증 순서를 공유합니다.
발자국과 물 튀김은 트리거가 다를 뿐 표면 조회, 강도 계산, 사용자 파라미터 전달, 짧은 수명 주기라는 같은 검증 순서를 공유합니다.
- 공통 처리 흐름
pipeline 발은 Anim Notify, 물체는 Hit 또는 Overlap으로 정확한 발생 순간을 잡습니다. 라인 트레이스나 Hit Result에서 위치, normal, 표면 재질을 읽습니다. User.ImpactForce 와 User.SurfaceNormal 처럼 시스템 입력으로 넘깁니다. 짧은 Lifetime, Collision Kill, 낮은 Spawn Count로 반복 비용을 제한합니다.
- 1. Trigger
발은 Anim Notify, 물체는 Hit 또는 Overlap으로 정확한 발생 순간을 잡습니다.
- 2. Surface Query
라인 트레이스나 Hit Result에서 위치, normal, 표면 재질을 읽습니다.
- 3. User Params
User.ImpactForce 와 User.SurfaceNormal 처럼 시스템 입력으로 넘깁니다.
- 4. Short Life
짧은 Lifetime, Collision Kill, 낮은 Spawn Count로 반복 비용을 제한합니다.
- 효과별 검증표
debug 효과 트리거 위치 강도 종료 Footstep 발 접지 Notify 발 소켓 아래 Trace 속도와 보행 상태 0.5~1초, Kill Water Splash Hit 또는 Overlap Hit Location 충돌 속도와 Normal Impulse 짧은 방울 수명 Shared 중복 호출 차단 normal 방향 보정 Map Range Clamped 풀링 여부 확인
발자국과 물 튀김은 트리거 위치, 표면 정보, 충돌 강도를 사용자 파라미터로 넘겨야 같은 시스템도 상황에 맞게 반응합니다.
충돌, 속도, 데미지, 표면 타입 같은 입력을 효과의 생성량, 방향, 색, 수명에 연결한다.
| 게임 입력 | 전달 파라미터 | 효과에서 쓰는 값 | 실패 신호 |
|---|---|---|---|
| Hit Event | Impact Point, Normal | 스폰 위치와 방출 방향 | 충격 위치가 어긋남 |
| Velocity | Speed, Direction | 방출 세기와 꼬리 방향 | 움직임과 효과 강도가 따로 놈 |
| Damage | Damage Amount, Type | 크기, 색, 개수 스케일 | 강한 타격도 같은 효과 |
| Surface | Physical Material | 색, 파편, 소리와 결합 | 재질별 차이가 없음 |
| Lifetime | Duration, Auto Destroy | 잔상 유지와 정리 | 효과가 누적되거나 너무 짧음 |
성능 최적화 (발자국/물 튀김)
이러한 이펙트들은 자주 발생할 수 있으므로, 최적화가 더욱 중요합니다.
- 짧은
Lifetime: 파티클의 수명을 최대한 짧게 유지하여 동시에 활성화되는 파티클 수를 줄입니다. - 낮은
Spawn Count: 시각적 품질을 해치지 않는 선에서Spawn Burst의 수를 최소화합니다. - 간단한 머티리얼:
Unlit&Translucent또는Additive블렌드 모드의 간단한 텍스처 머티리얼을 사용합니다. Collision최소화:Collision모듈의 복잡한 설정을 피하고,Max Collisions를 1로 설정하여 한 번 충돌 후 바로 사라지게 하는 등 불필요한 계산을 줄입니다.- 오브젝트 풀링: 매우 자주 발생하는 효과(예: 발자국)의 경우, 블루프린트에서 나이아가라 컴포넌트 풀링 시스템을 구현하여 매번
Spawn System at Location을 호출하는 대신 이미 생성된 컴포넌트를 재활용하는 것이 성능에 유리합니다.
발자국과 물 튀김 같은 반응형 이펙트는 재질, 충돌 지점, 이동 속도 데이터를 기준으로 생성 조건을 정해야 합니다.
반복 발생하는 반응형 이펙트는 재질 분기, 중복 호출 방지, 풀링 기준까지 한 번에 묶어 두어야 장면이 복잡해져도 예산을 넘지 않습니다.
발자국과 물 튀김은 짧게 보이지만 자주 발생합니다. 표면 분기와 풀링을 함께 설계해야 누적 비용을 제어할 수 있습니다.
- Surface재질 분기
Surface 흙, 물, 눈은 별도 시스템보다 색, 텍스처, 스폰량 입력으로 나눕니다.
- Throttle중복 호출 방지
Throttle 같은 발 접지나 연속 Hit가 한 프레임에 여러 번 스폰되지 않게 막습니다.
- Pool컴포넌트 재사용
Pool 자주 쓰는 발자국과 튀김은 생성과 파괴 대신 풀에서 꺼내 씁니다.
- Limit동시 수 제한
Limit 화면 안 활성 시스템 수와 Spawn Count 상한을 먼저 정합니다.
발자국과 물튀김은 표면 정보와 이벤트 빈도가 품질을 좌우하므로, 스폰 기준을 따로 잡아 둡니다.
발자국과 물튀김은 캐릭터 접지 이벤트와 표면 정보를 받아 위치, 방향, 강도를 다르게 주면 자연스럽습니다.
- 발 이벤트
Notify Anim Notify나 발 소켓 기준으로 좌우 발 위치를 정확히 잡습니다.
- 표면 타입
Surface Line Trace 결과의 Physical Material로 먼지, 물, 진흙 표현을 나눕니다.
- 물튀김 강도
Strength 속도와 낙하 높이로 Splash 높이와 입자 수를 조정합니다.
- 수명 정리
Clean 발자국 Decal과 파티클 Lifetime을 분리해 잔상이 과하지 않게 합니다.
- 중복 스폰
걷기와 달리기 이벤트가 겹쳐 같은 발에서 두 번 나오지 않게 합니다.
- 방향
발바닥 노멀과 물 표면 노멀을 기준으로 파티클 회전을 맞춥니다.
- 거리 LOD
멀리 있는 발자국과 작은 물튀김은 스폰 자체를 줄입니다.
발자국이나 물튀김 같은 이펙트는 충돌 입력, 표면 정보, 렌더 비용, 재현 기준으로 점검합니다.