
내용
- 영상 제목: [언리얼 페스트 서울 2025] Day1 나이아가라로 인터랙티브한 파티클 효과 제작해 보기
- 채널명: Unreal Engine KR
- 영상 링크: https://youtu.be/rTWIk7hv_Z8
- 인터랙티브 파티클의 개념 및 핵심 기반 기능: 플레이어 동작과 환경 변화에 실시간으로 반응하는 파티클 시스템의 정의와 이를 구현하기 위한 언리얼 엔진 핵심 기능(나이아가라 파라미터 컬렉션, 렌더 타깃 텍스처, Grid 2D, 시뮬레이션 스테이지)의 역할과 연동 방식 설명
- 빛을 피하는 파티클 (디스턴스 필드 & NPC 연동): 스포트라이트 정보를 나이아가라 파라미터 컬렉션(NPC)으로 전송하고, Avoid Cone, Projection Velocity to Distance Field, Avoid Box Edges 커스텀 스크래치 모듈을 활용해 월드 지오메트리 표면을 따라 빛을 도망치는 연출 구현
- 충돌 속도를 반영하는 집회 휘날림 이펙트 (Velocity to Render Target): 캐릭터 및 액터의 충돌 속도를 렌더 타깃(RT)에 굽고, Read Velocity 및 Aerodynamic Drag, Align Particles with Collision Plane 모듈을 조합해 바닥에 깔린 종이가 물리적으로 정교하게 휘날리고 정지하는 시뮬레이션 구현
- 캐릭터 표면을 타고 흐르는 빗방울 및 궤적 마스킹 (Traverse Skeletal Mesh & Grid 2D): Traverse Skeletal Mesh 계열 모듈로 메시에 파티클을 부착하여 유동시키고, Grid 2D 및 Particle Attribute Reader(PAR), 커스텀 HLSL 루프 연산을 연동하여 표면 궤적(Trail) 마스크를 렌더 타깃에 누적·감쇠(Accumulated Decay)시켜 머티리얼로 전달하는 고급 워크플로우 제시
1. 인터랙티브 파티클 개요 및 필수 제어 기능 (00:00:00 ~ 00:05:32)
- 인터랙티브 파티클의 정의 [00:56]: 플레이어의 행동이나 환경 변화에 실시간 반응하여 동적으로 변화하는 파티클 효과로, 빛에 반응하는 벌레, 캐릭터 움직임에 휘날리는 지폐, 표면을 타고 흐르는 빗방울 등이 대표적 예시입니다.
- 구현을 위한 언리얼 엔진의 필수 기능 [01:43]:
- 나이아가라 파라미터 컬렉션 (NPC) [01:55]: 블루프린트(BP)에서 설정한 액터의 위치, 속도 등의 변수를 나이아가라 시스템으로 전송하는 전역 파라미터 컨테이너입니다. 머티리얼 파라미터 컬렉션(MPC)과 유기적으로 유사하게 동작합니다.
- 렌더 타깃 텍스처 (Render Target Texture, RT) [02:53]: 캐릭터의 실시간 위치나 속도 데이터 등을 실시간으로 텍스처 맵에 기록하여 머티리얼 및 나이아가라 간에 상호 전달하는 동적 텍스처입니다.
- Grid 2D [03:22]: 2D 배열 형태의 데이터 맵으로, 각 셀에 다양한 수치 정보를 읽고 쓸 수 있습니다. 플루이드 시뮬레이션이나 궤적 추적처럼 데이터의 '누적(Accumulate)' 및 '감쇠(Decay)'가 필요한 연산에 활용되며, 주로 연산 결과를 렌더 타깃으로 내보냅니다.
- 시뮬레이션 스테이지 (Simulation Stage) [05:02]: 기존 파티클 스테이지(Emitter Spawn/Update, Particle Spawn/Update)와 달리 유저가 정의한 맞춤형 연산을 수행하는 공간입니다. 파티클 데이터의 반복 연산 및 Grid 2D/3D 제어를 담당합니다.
2. 예제 1: 빛을 피하는 파티클과 디스턴스 필드 연동 (00:05:33 ~ 00:14:38)
- 빛 반응 파티클 구성 방식 [05:46]: NPC를 이용해 스포트라이트의 반경, 위치, 방향 속성을 전달받고 나이아가라 내부 모듈과 상호작용하도록 연동합니다.
- 주요 모듈 및 구현 알고리즘 [07:00]:
- Avoid Cone [07:26]: 원뿔 영역을 정의하고 파티클이 영역 내에 진입하면 외곽으로 밀어내는 포스(Force)를 발생시킵니다. BP에서 전달받은 스포트라이트 속성값을 콘 파라미터로 매핑합니다.
- Update Mesh Orientation [08:03]: 파티클 진행 방향(Velocity)을 향해 메시를 정렬합니다. 평면에 붙어 움직이도록 Bank Rate는 0으로 설정합니다.
- Projection Velocity to Distance Field [08:54]: 디스턴스 필드(DF)의 그래디언트 값으로 노멀 벡터를 추출하고, Project Vector on Plane 연산을 통해 속도 벡터를 DF 표면에 평행하게 투영합니다.
- Move to Nearest Distance Field Surface GPU [09:41]: 파티클을 가장 가까운 디스턴스 필드 표면으로 강제 이동시켜 파티클이 월드 지오메트리 이탈 없이 표면에 밀착되도록 제어합니다.
- Avoid Box Edges (커스텀 스크래치 모듈) [10:05]: 파티클이 설정된 박스 영영(Shape Location 크기)의 외곽 감쇠 구간(Falloff Distance)에 진입하면 중앙 방향으로 밀어내는 포스를 부여하여 특정 영역을 벗어나지 못하도록 경계를 형성합니다.
- 빛 진입에 따른 머티리얼 색상 변경 [11:10]: Avoid Cone 모듈이 출력하는 Normalized Masked 값을 받아 Lerp Linear Colors로 연결하여 빛 바깥은 검은색, 빛 내부 진입 시 빨간색으로 시각적 피드백을 처리합니다.
- 에디터 시연 및 BP 파라미터 연동 [11:39]: BP에서 스포트라이트의 Outer Cone Angle 및 위치값을 틱 단위로 NPC에 업데이트함으로써, 에디터 상에서 라이트 반경 변동 시 즉각 반응 파티클 범위가 실시간 동기화됨을 확인합니다.
3. 예제 2: 액터 충돌 속도 기반 지폐 휘날림 연출 (00:14:39 ~ 00:28:19)
- 구조 및 시스템 구성 (5개 핵심 요소) [15:01]:
- 충돌 속도를 기록할 렌더 타깃 및 NS_Velocity2RT 나이아가라 시스템
- 렌더 타깃을 읽어 파티클을 움직이는 NS_Dollars 나이아가라 시스템
- 시스템을 담는 블루프린트 액터 (BP_Dollars)
- 캐릭터 및 오브젝트용 3인칭 블루프린트 (BP_ThirdPersonCharacter)
- 데이터 매개체인 나이아가라 파라미터 컬렉션 (NPC)
- 속도 기록 시스템 (NS_Velocity2RT) 연산 흐름 [15:37]:
- Set Render Target 모듈에서 RT 해상도를 설정합니다(속도 표현용이므로 256x256으로 충분) [15:50].
- Find Colliders 모듈에서 Find Actors 노드를 통해 기준 지점(Plane Position) 중심 범위 내의 액터 중 컴포넌트 태그가 Collider로 지정된 액터(스켈레탈 메시 등)를 검출합니다 [16:01].
- Draw Velocity to Render Target (시뮬레이션 스테이지) [17:07]: RT의 UV 좌표를 월드 공간으로 전개(World Position XY + Plane Position Z)한 뒤, Get Closest Point 노드로 충돌 지점의 속도(Velocity)를 구하여 RT에 수치를 직접 기록합니다. UV와 월드 공간의 일치가 싱크의 핵심입니다 [18:37].
- 지폐 동작 시스템 (NS_Dollars) 반응 구현 [20:25]:
- 월드 공간을 다시 RT UV 공간으로 변환하여 속도값을 샘플링한 후 Linear Force에 연결합니다. 벡터 곱셈(Multiply Vector by Float)으로 힘의 강도를 스케일링합니다 [21:26].
- Aerodynamic Drag 모듈과 Align Sprite to Mesh Orientation 모듈을 연동하여 종이 특유의 공기 저항 및 펄럭임을 연출합니다 [21:38].
- Align Particles with Collision Plane 모듈을 활성화하여 회전각을 바닥 노멀(X축 정렬)에 맞추고, 바닥에 낙하 시 Resting on Surface 모듈 동작을 통해 파티클을 레스트(Rest) 상태로 전환함으로써 연산 낭비와 자연스럽지 않은 떨림을 방지합니다 [22:26].
- 에디터 시연 [23:09]: 디버그 뷰를 통해 RT에 캐릭터 및 래그돌, 주변 오브젝트의 이동 속도가 실시간으로 감지되어 저장되는 과정을 확인하고, Multiplier 수치 조절에 따른 움직임의 역동성을 검증합니다 [25:58].
4. 예제 3: 스켈레탈 메시 표면 빗방울 및 Grid 2D 궤적 마스킹 (00:28:20 ~ 00:39:52)
- 시스템 구성 [28:37]: 파티클 표면 유동을 제어하는 이미터와 궤적을 렌더 타깃에 구워내는 이미터, 총 2개의 이미터로 구성됩니다.
- 스켈레탈 메시 표면 유동 (Traverse Skeletal Mesh) [29:05]:
- 순정 모듈 4종(Initialize Traverse Skeletal Mesh, Prepare Traverse Skeletal Mesh, Traverse Skeletal Mesh, Apply Traverse Skeletal Mesh Update)을 순차 연결하여 캐릭터 표면 위를 흐르도록 설정합니다 [29:29].
- Add Random Velocity 커스텀 모듈로 X축 속도에 사인(Sine) 애니메이션을 부여해 지그재그 움직임을 생성하고, Delete Stopped Particles 커스텀 모듈로 표면에 정지하여 움직이지 않는 불량 파티클을 소멸시킵니다 [36:24].
- Grid 2D 기반 궤적(Trail) 기록 메커니즘 [30:05]:
- Set Grid 2D & RT 모듈로 그리드 셀 크기와 RT 해상도를 동일하게 매핑합니다 [30:26].
- Set Mask 스테이지에서 On Simulation Reset 시 마스크 변수값을 초기화합니다 [30:39].
- Draw Mask (시뮬레이션 스테이지, Always 실행) [30:50]: Particle Attribute Reader (PAR)를 통해 빗방울 파티클 이미터의 위치 데이터를 가져옵니다 [31:15].
- Draw Particle Mask (스크래치 모듈 연산 흐름) [31:32]:
- Grid 2D의 Exec Index to UV로 UV 좌표를 구함 [32:07]
- Triangle Coord UV 노드로 UV 점이 스켈레탈 메시의 어떤 삼각형 영역(Barycentric 좌표)에 있는지 추출 [32:17]
- Get Skinned Triangle Data WS 노드를 통해 해당 삼각 좌표의 월드 포지션 변환 [32:29]
- Get Particle Mask by Index (HLSL 커스텀 노드) [32:40]: for 루프를 순회하며 메시 표면 위치와 모든 빗방울 파티클 위치 간의 거리를 계산하여 통합 마스크(Total Particle Mask) 생성
- 누적 및 감쇠 공식 [33:42]: (이전 마스크 값 * 0.98) + 신규 마스크 값 구조를 사용합니다. 0.98 곱셈 연산은 시간에 따른 감쇠(Decay)를, 더하기 연산은 궤적의 누적(Accumulate)을 구현합니다.
- 머티리얼 연동 및 에디터 시연 [34:14]: 렌더 타깃 마스크 데이터를 머티리얼로 전달하여 러프니스(Roughness), 노멀(Normal), 베이스 컬러(Base Color)에 Lerp로 혼합함으로써 캐릭터 피부 및 옷감 위에 젖은 궤적과 빨간 액체 흔적이 남는 효과를 완성합니다 [38:53].
댓글