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

[Unreal] Third Person Sample Stack-O-Bot explained (Step 2/4)

by Minkyu Lee 2026. 7. 25.

 

핵심 요약 (Conclusion)

  • 프로젝트 개요: 언리얼 엔진 5(Unreal Engine 5) 마켓플레이스에 공개된 소규모 샌드박스 스타터 키트인 'Stack-O-Bot'의 내부 구조와 주요 신기술 적용 워크플로우를 다룹니다.
  • 월드 파티션 및 협업 구조: World Partition 기술로 대규모 레벨의 그리드 로딩을 관리하며, One File Per Actor(OFPA) 및 Packed Level Blueprints를 적용하여 동시 협업 환경을 구축했습니다.
  • 렌더링 및 최적화: Lumen(글로벌 일루미네이션)과 Nanite(가상화 지오메트리)를 적용하고, Virtual Shadow Maps(VSM)의 연산 부담을 줄이기 위해 거리별 애니메이션 머티리얼(WPO 사용 유무) LOD 교체 최적화를 적용했습니다.
  • 컨트롤 릭 및 Full Body IK: Control Rig의 Full Body IK(FBIK) 솔버를 이용해 지형 고저차에 맞춘 정밀한 발 접지(Foot Placement)와 버튼 누르기 연출 시 손가락 위치 보정을 구현했습니다.
  • 메타사운드 및 나이아가라: 실시간 매개변수(엔진 회전수, 피치 변화, 타이밍)에 따라 가변적으로 소리가 변하는 MetaSound 오디오 시스템과 스켈레탈 메시 소켓 기반 Niagara 제트팩 연출을 통합했습니다.
  • 게임플레이 메커니즘: Enhanced Input System을 활용한 입력 제어, 컴포넌트 기반 상호작용(Interaction Component), 동적 로봇 스폰 및 디졸브(Dissolve) 처리, Game Instance 기반 데이터 저장 및 UI 시스템을 명확히 제시합니다.

 

1. 프로젝트 개요 및 월드 파티션 환경 설정 (00:00:00 ~ 00:02:54)

  • 프로젝트 목적 및 구성 (00:00:00): 소규모 내부 팀이 개발한 1GB 미만의 UE5 스타터 프로젝트로, 젯팩 이동, 스폰, 버튼 상호작용 등의 기능을 제공하며 신규 입문자와 개발자 모두를 위한 샌드박스로 구성되었습니다. [00:05]
  • 주요 적용 기술 (00:00:35): Lumen, Nanite, World Partition, Enhanced Input System, Control Rig(Full Body IK) 등 UE5의 핵심 신기술들이 망라되어 있습니다. [00:43]
  • 월드 파티션(World Partition) 셀 로딩 (00:01:48): 오픈 시 작게 노출되는 레벨 영역은 World Partition 윈도우에서 전체 셀을 선택하고 Load하는 방식으로 풀 맵을 로드합니다. [01:59]


  • 셀 영역 및 로딩 범위 설정 (00:02:04): World Settings에서 셀 크기와 로딩 거리를 지정할 수 있으며, 중요 테스트 아웃라인 엑터들은 'Always Loaded'로 고정 설정되어 있습니다. [02:17]
  • Packed Level Blueprints 및 OFPA (00:02:25): 배경 건물들은 여러 메시를 하나로 모은 Packed Level Blueprint로 묶여 있어, 한 인스턴스를 수정 후 커밋하면 다른 복사본에도 동시 적용됩니다. [02:33]
  • One File Per Actor(OFPA) 워크플로우 (00:02:49): 레벨 내 모든 액터를 개별 파일 단위로 관리하여 여러 팀원이 동일한 맵에서 충돌 없이 동시에 작업할 수 있는 환경을 선사합니다. [02:55]

 

2. 루멘, 나나이트 및 버추얼 섀도 매핑 최적화 (00:02:55 ~ 00:04:24)

  • Lumen 및 Virtual Shadow Maps 설정 (00:02:55): Project Settings - Rendering 탭에서 Lumen GI와 베타 기능인 Virtual Shadow Maps(VSM)를 활성화하여 고품질 실시간 라이팅과 그림자를 구현했습니다. [03:03]
  • Nanite의 범용적 활용 (00:03:24): 고해상도 바위뿐만 아니라 디테일이 낮은 로우폴리 모듈러 부품에도 Nanite를 적용하여 LOD 제작 과정 없이 화면 해상도에 맞춘 최적화를 달성했습니다. [03:40]
  • Nanite 미지원 머티리얼 대응 (00:03:45): World Position Offset(WPO) 기반 바람 흔들림이 적용된 나무나 투명(Translucent) 머티리얼은 Nanite가 지원되지 않으므로 일반 스태틱 메시로 설정했습니다. [03:53]
  • VSM 성능 최적화 기법 (00:03:58): 움직이는 WPO 메시가 VSM의 그림자 맵 갱신(Invalidation)을 유발해 성능을 떨어뜨리는 문제를 방지하기 위해 2개의 LOD를 구성했습니다. [04:08]
  • LOD 거리 교체 로직 (00:04:16): 근거리에선 바람에 흔들리는 WPO 머티리얼(LOD 0)을 사용하고, 정해진 거리를 벗어나면 바람 연산이 없는 정적 머티리얼(LOD 1)로 자동 교체되도록 처리했습니다. [04:24]

3. 머티리얼 시스템, 랜드스케이프 및 버추얼 텍스처 (00:04:25 ~ 00:06:02)

  • 공용 베이스 머티리얼 구축 (00:04:25): 드로우콜 감소를 위해 베이스 머티리얼 하나로 Color, Emissive, AO, Metallic, Vertex Color를 처리하도록 최적화했습니다. [04:45]


  • Material Parameter Collection(MPC) 활용 (00:04:49): 공용 색상 매개변수를 MPC에 연결하여 여러 프롭 및 모듈러 메시의 머티리얼 속성을 한꺼번에 제어합니다. [04:58]
  • Landscape Virtual Texture 블렌딩 (00:05:03): 바위, 모래, 자갈, 풀 레이어를 출력하는 랜드스케이프 머티리얼의 결과를 런타임 버추얼 텍스처(RVT)에 기록합니다. [05:17]
  • 바위와 지형의 이중 블렌딩 (00:05:17): 바위 머티리얼 하단부에 RVT 데이터를 샘플링하여 지형과 바위 접촉면이 자연스럽게 섞이도록 표현했습니다. [05:26]
  • 플레이어 상호작용 수풀 및 풀 표현 (00:05:26): 캐릭터가 이동할 때 수풀과 풀이 옆으로 밀리는 반응을 표현하기 위해 MPC에 플레이어 위치 값을 Tick 단위로 업데이트합니다. [05:40]
  • 머티리얼 픽셀 오프셋 연산 (00:05:48): 수풀 머티리얼 내 위치 차이 벡터 계산 노드를 추가하여 플레이어가 가까워지면 밀려나도록 오프셋을 산출합니다. [06:03]

 

4. 캐릭터 애니메이션 블루프린트 & 린(Lean) 연출 (00:06:03 ~ 00:08:26)

  • 스켈레탈 구조 및 애님 블루프린트 (00:06:03): 모듈식으로 설계된 애니메이션 블루프린트, 피직스 에셋(Physics Asset), Full Body IK 솔버 기반 Control Rig로 캐릭터 시스템을 구축했습니다. [06:30]
  • 애니메이션 스테이트 머신 구조 (00:06:54): Ground Locomotion, Air Locomotion, 상체 전용 Montage 플레이를 위한 Upper Body Slot, 보정용 Control Rig 노드로 정돈되어 있습니다. [07:08]
  • 회전 시 기울어짐(Lean) 연산 로직 (00:07:14): Update Animation 이벤트에서 이전 회전과 현재 회전의 Delta 값을 구하고, FInterp To 노드로 평활화(Smooth)하여 린 몽타주 Blendspace 축으로 전달합니다. [07:32]
  • 공중 및 착지(Land) 분기 처리 (00:07:40): 공중 상태에서 입력 벡터(Input Vector) 길이를 체크하여, 입력 값이 0이면 제자리 착지(Stand Land)로, 입력이 존재하면 달리기 착지(Run Land)로 스테이트 전환을 유도합니다. [08:00]
  • 애니메이션 노티파이(Anim Notify) 착지 효과 (00:08:08): 착지 순간 Anim Notify를 호출하여 subtle 카메라 셰이크(Camera Shake) 효과를 발동시킴으로써 착지 임팩트를 강조합니다. [08:17]
  • 상체 전용 상호작용 분기 (00:08:28): 버튼 입력 시 하체 이동 모션은 유지한 채 상체에서만 버튼 누르기 몽타주가 실행되도록 Layered blend per bone 노드를 구성했습니다. [08:38]

 

5. 컨트롤 릭(Control Rig)과 Full Body IK(FBIK) 발 접지 시스템 (00:08:27 ~ 00:09:42)

  • 경사지 발 접지(Foot Placement) 필요성 (00:08:47): 경사면이나 경계턱을 걸어갈 때 발이 허공에 뜨거나 땅에 파묻히는 현상을 해결하기 위해 Control Rig를 적용했습니다. [08:58]
  • 라인 트레이스(Line Trace) 기반 지형 검출 (00:09:04): 발 컨트롤러 위치에서 아래 방향으로 Line Trace를 실행하여 충돌 위치의 Z 높이와 표면 노멀(Normal) 벡터를 구합니다. [09:12]
  • 회전 매트릭스 및 보간 보정 (00:09:12): 노멀 벡터 기반으로 회전 매트릭스를 구성하고, Interp 노드를 통해 회전과 높이 변화 속도를 부드럽게 보간합니다. [09:25]
  • Full Body IK(FBIK) 솔버 적용 (00:09:31): 최종 산출된 Z 오프셋 및 회전 값을 FBIK 솔버 노드의 에펙터(Effector)로 전달하여 전체 다리 관절 노드를 자연스럽게 굴절시킵니다. [09:36]

6. 캐릭터 블루프린트 & 향상된 입력 시스템(Enhanced Input) (00:09:43 ~ 00:11:08)

  • Character 기반 클래스 구조 (00:09:43): Capsule, Skeletal Mesh, Character Movement 컴포넌트로 구성되며 속도, 점프 높이, 공중 제어력(Air Control) 파라미터를 맞춤 조정했습니다. [09:56]
  • 컴포넌트 구성 요소 (00:10:02): 카메라 붐 및 카메라, 젯팩 스켈레탈 메시, Niagara 스러스트 효과, 메타사운드 오디오 컴포넌트가 추가 내장되어 있습니다. [10:14]
  • Enhanced Input System 매핑 (00:10:21): Input Action 매핑을 축 및 버튼 단위로 분리 생성하고, 조이스틱 데드존(Dead Zone) 등은 Trigger 및 Modifier 레벨에서 세밀히 처리했습니다. [10:42]
  • 컨텍스트 등록 및 이벤트 확장 (00:10:50): 캐릭터가 Possess될 때 Mapping Context를 등록하며, 기존 Input보다 풍부한 Exec 핀과 상태 옵션을 활용해 이동 연산을 처리합니다. [11:03]

 

7. 제트팩 시스템 구현 & 나이아가라(Niagara) 파티클 (00:11:09 ~ 00:12:28)

  • 제트팩 발동 조건 (00:11:09): 점프 상태(In Air)에서 점프 키를 추가 입력하면 2단 점프 형태의 제트팩 활성화 모드로 진입합니다. [11:22]
  • 착지 및 리셋 처리 (00:11:34): On Landed 이벤트를 수신받아 남아있는 공중 체류 가능 시간을 초기화하고 스러스트 효과 및 오디오를 정지시킵니다. [11:40]
  • Niagara 파티클 구조 (00:11:50): Spawn Rate, Velocity, Particle Color, 단순 머티리얼 노드로 구성된 가벼운 파티클 시스템입니다. [12:05]
  • Skeletal Mesh Socket 오토 샘플링 (00:12:12): 제트팩 스켈레탈 메시의 2개 소켓 위치를 Niagara의 Skeletal Mesh Location 노드로 자동 샘플링하여 파티클 방출 위치를 정확히 맞춥니다. [12:24]

8. 메타사운드(MetaSound)를 이용한 적응형 사운드 디자인 (00:12:29 ~ 00:14:11)

  • 노드 기반 오디오 제작 (00:12:29): 머티리얼 에디터 방식의 노드그래프로 실시간 매개변수에 맞춰 사운드가 변하도록 디자인된 UE5 오디오 도구입니다. [12:36]
  • 음원 소스 합성 기법 (00:12:43): 점화 sound(Ignite), 지속 음(Looping sound), 종료 sound(Winding down sound) 3개 오디오 샘플을 조합했습니다. [12:49]
  • 실시간 엔벨로프 및 피치 제어 (00:12:56): 점화 후 루프 음으로 전환할 때 Envelope 노드를 활용해 Pitch 값을 조절하고, 사용자 정의 Trigger 호출 시 루프 정지 및 Winding down 오디오를 출력합니다. [13:02]

 

  • 커브 기반 가속도 연산 (00:13:25): Tick 연산에서 체류 시간을 정규화(Normalize)한 뒤 Curve 에셋을 참조하여 초기 상승 스러스트와 점진적 감쇄를 동적으로 전달합니다. [13:39]
  • Niagara User Parameter 연동 (00:13:52): Curve에서 도출된 스러스트 강도 값을 Niagara의 User.ThrusterStrength 파라미터로 전달하여 화염 입자의 수명을 조절합니다. [13:59]

9. 카메라 시스템 & 플레이어 컨트롤러(Player Controller) (00:14:12 ~ 00:16:08)

  • 동적 카메라 길이야 충돌 감지 (00:14:29): Tick 연산에서 캐릭터 상단으로 Line Trace를 수행하여 장애물이 감지되면 붐 길이를 축소하고, 공중 비행 시 붐 길이를 확대합니다. [14:40]
  • FInterp To 보간 적용 (00:14:46): 타겟 붐 길이로 급격히 변하지 않도록 FInterp To 보간을 적용해 매끄러운 카메라 거리 변화를 완성합니다. [14:53]
  • Player Controller 역할 분담 (00:15:15): Player Controller는 클라이언트 전용 UI 생성, 마우스 커서 숨김, Input Mode: Game Only 지정, 카메라 Yaw 범위 제한 등을 관장합니다. [15:29]
  • 입력 로직의 배치 전략 (00:15:46): 단일 플레이어 샌드박스의 특성상 모든 조작 로직을 캐릭터 블루프린트에 배치했으나, 멀티플레이나 다중 캐릭터 구성 시 Controller 레벨로 분리하는 구조가 권장됩니다. [16:03]

10. 로봇 스폰, 물리 랙돌(Ragdoll) 및 표현(Facial Expression) 머티리얼 (00:16:09 ~ 00:18:54)

  • 신규 로봇 생성 시 콜리전 변경 (00:16:27): 플레이어가 스폰 버튼을 누르면 캡슐 콜리전이 꺼지고 스켈레탈 메시의 피직스 자산 콜리전이 즉시 활성화됩니다. [16:34]
  • Physics Asset 다단 구성 (00:16:40): 머리 부분은 올라탈 수 있는 스태틱 발판 콜리전을 추가하고, 목 관절에 앵글 모터를 부여해 머리가 수평을 유지하도록 바디 피직스를 커스텀했습니다. [16:54]
  • 부분 랙돌 및 스폰 분기 (00:17:00): 카메라 붐의 추적을 해제한 후 비활성 스테이트로 전환하며, 랙돌 상태 체크 타이머를 기동시킵니다. [17:12]
  • 머티리얼 배열 및 표정 변경 (00:17:23): Construction Script에서 모든 머티리얼 인스턴스를 배열로 수집하고, Flipbook 기법과 연산 마스크를 통해 표정 텍스처 아틀라스를 전환합니다. [17:43]
  • 낙하/충돌 랙돌 검출 마크로 (00:18:15): 로봇 속도가 초과되거나, 바닥 검출 트레이스 실패, 혹은 목이 과도하게 꺾이는 현상이 발생하면 완벽한 피직스 랙돌로 전환됩니다. [18:44]

11. 게임 모드(Game Mode)와 스폰 개수 제어 & 나이아가라 디졸브(Dissolve) (00:18:55 ~ 00:20:39)

  • Game Mode의 스폰 제어 (00:18:56): 새로운 로봇을 활성화된 Spawn Pad 위치에 생성하고, 최대 생성 개수를 관리하는 Function Library를 참조합니다. [19:10]
    펑션 라이브러리 (FL)

  • 최대 개수 초과 시 Dissolve 연출 (00:19:28): 필드에 존재하는 로봇 수가 제한을 초과하면 가장 먼저 생성되었던 로봇의 피직스를 끄고 Dissolve 효과를 실행합니다. [19:34]
  • Niagara Dissolve 파티클 연산 (00:19:52): Instantaneous Burst 방출, Curl Noise, Gravity Force를 조합하고, 스켈레탈 메시 표면 위치를 샘플링하여 파티클 소멸 효과를 보여줍니다. [20:12]

 

  • 색상(Hue) 시프트 및 소멸 처리 (00:20:17): 스폰 인덱스에 맞춰 머티리얼 Hue 값을 변환한 후 10초 후 엑터를 레벨에서 메모리 해제(Destroy Actor)시킵니다. [20:35]

12. 스폰 패드(Spawn Pad) 연출 및 머티리얼 슬라이스(Slice) 인쇄 효과 (00:20:40 ~ 00:23:13)

  • Spawn Pad 에셋 구성 (00:20:52): 카메라, 승하강 링 메시, 3D 홀로그램 머티리얼 플레인으로 구성됩니다. [20:56]
  • 타임라인 기반 링 애니메이션 (00:21:32): 스폰 진행 시 링이 천천히 올라갔다가 빠르게 내려오는 타임라인이 동작하며 링의 Z 위치 값을 캐릭터 머티리얼로 보냅니다. [21:45]
  • 3D 프린팅 머티리얼 연산 (00:21:56): 머티리얼 내에서 링의 Z 값(Slice Z)과 상향 벡터의 내적(Dot Product)을 연산하여 캐릭터가 3D 프린터로 제작되는 듯한 슬라이스 셰이딩을 구현했습니다. [22:22]
  • 내부 채움 Emissive 연출 (00:22:27): 단면 내부에 오렌지색 Emissive 마스크를 씌워 메카닉 로봇 내부가 칠해지며 스폰되는 효과를 연출합니다. [22:34]

 

13. 컴포넌트 기반 상호작용 시스템(Interaction Component) & 압력판/문 (00:23:14 ~ 00:26:15)

  • 컴포넌트 중심 상호작용 설계 (00:23:38): 버튼, 승강기, 발판 등 다양한 오브젝트에 공통 연결 가능한 Interactive Component를 제작했습니다. [23:45]
  • Event Dispatcher 바인딩 (00:23:50): 상호작용 시작/종료/활성화/비활성화 시 이벤트 디스패처를 호출하여 결합도를 낮췄습니다. [24:00]
  • 압력판(Pressure Plate) 트리거 로직 (00:24:09): 커스텀 채널인 'Trigger' Object 채널을 사용해 물체 가침 시 Begin Overlap이 발동하고, 타임라인으로 상하 이동을 구현합니다. [24:31]
  • 연동문(Door) 배열 처리 (00:25:08): 문 액터는 레벨 디자이너가 스폰 시 지정할 수 있는 Trigger 배열과 활성화 요구 개수 변수를 보유합니다. [25:20]
  • 다중 조건 검증 (00:25:28): 압력판 이벤트 디스패처에 바인딩된 수치가 요구 조건과 일치하면 타임라인을 가동시켜 문 날개를 좌우로 이동시킵니다. [25:40]

14. 버튼 상호작용, 캐릭터 방향 체크 및 컨트롤 릭 애니메이션 보정 (00:26:16 ~ 00:30:00)

  • 방향성 검증(Orientation Check) (00:26:40): 플레이어가 버튼 상호작용 범위 내에 들어오면 내적(Dot Product) 연산 기반 타이머가 가동되어 버튼을 정면으로 바라보고 있는지 검증합니다. [26:53]
  • 3D Screen Space Widget 노출 (00:27:26): 상호작용이 가능한 상태가 되면 "Press E" 형태의 2D/3D 위젯 컴포넌트를 렌더링합니다. [27:32]
  • Target Position Arrow 전달 (00:27:44): 버튼 내 위치 지정용 Arrow 컴포넌트 좌표 값을 캐릭터의 Interaction Component 변수로 넘겨줍니다. [27:56]
  • 오브젝트 중심 몽타주 재생 구조 (00:28:37): 버튼 오브젝트가 캐릭터에 몽타주를 명령하는 방식으로 설계하여 레버, 스위치 등 대상 오브젝트에 따라 상이한 몽타주 연출이 가능합니다. [28:49]
  • Control Rig 기반 손가락 위치 보정 (00:29:19): 버튼의 월드 위치를 Control Rig의 Effector 위치로 연결하고, 몽타주 엑스트라 커브 데이터와 검지 손가락 뼈대를 조율해 자연스러운 누름 모션을 완성합니다. [29:36]

15. 방 생성 플러그인, 메타사운드 BGM, 게임 인스턴스(Game Instance) 및 저장 시스템 (00:30:01 ~ 00:32:33)

  • 모듈러 레벨 생성 플러그인 (00:30:18): 크기, 그리드 규격, 바닥 메시를 설정하면 자동으로 커스텀 벽면/방을 구성해주는 프로시저럴 레벨 구성 플러그인을 동봉했습니다. [30:35]
  • MetaSound 배경음악(BGM) 절차적 생성 (00:30:40): 톱니파 생성기(Saw Generator), 필터, 엔벨로프, 렌덤 노드를 조합하여 실시간 가변 BGM을 구현했습니다. [30:53]
  • Game Instance 레벨 지속 오디오 (00:31:09): 레벨 이동 시 음악이 끊기지 않도록 파시스턴트(Persistent) 성격을 지닌 Game Instance 상에서 오디오를 유지 관리합니다. [31:16]
  • Save Game 시스템 및 세이브 세션 (00:31:24): 수집품(Orb) 획득 상태, 캐릭터 위치, 인벤토리 데이터를 Interface 연동 구조로 Game Instance 세이브 파일에 기록합니다. [31:37]

댓글