프로젝트 소개 및 목적
- 개발 기간 : 2026.04.28 ~ 2026.05.28 ( 8일 )
- 참여 인원 : 4명
이번 프로젝트는 언리얼 C++를 기반으로 제작하며, 엔진의 구조와 클래스 간의 동작 흐름을 더 깊이 이해하는 계기가 되었습니다.
Actor, Component, PlayerController, PlayerState 등 주요 클래스의 역할을 직접 코드로 다루면서 기능을 구조적으로 설계하는 경험을 할 수 있었고, 반복적으로 사용되거나 확장 가능성이 높은 기능은 C++로 구현하는 것이 적합하다는 기준을 갖게 되었습니다.
또한 UI 연출이나 간단한 이벤트 처리처럼 빠른 수정이 필요한 부분은 블루프린트와 함께 활용하며, C++와 블루프린트를 상황에 맞게 조합하는 작업 흐름에 익숙해질 수 있었습니다.
개발한 컨텐츠

HP/Stamina UI

구현 내용
- ProgressBar를 활용한 HP / Stamina UI 구현
- 캐릭터의 현재 체력과 스태미나 값을 ProgressBar에 연동하여 실시간으로 변화가 반영되도록 구현했습니다.
- 플레이어 상태를 직관적으로 확인할 수 있도록 HP와 Stamina를 각각 분리하여 표현했습니다.
- Render Opacity를 활용한 UI 연출 구현
- Render Opacity 값을 조절하여 UI가 자연스럽게 표시되거나 사라지는 연출을 구현했습니다.
- 단순히 UI를 켜고 끄는 방식이 아니라, 투명도 변화를 통해 보다 부드러운 UI 렌더링 효과를 적용했습니다.
Prop and InterAction UI

구현 내용
- BoxCollider 기반 상호작용 감지 구현
- 플레이어가 상호작용 범위에 진입하면 BoxCollider를 통해 이를 감지하도록 구현했습니다.
- 범위 안에 들어온 경우 F Key 상호작용 UI를 표시하여 플레이어가 상호작용 가능 상태임을 직관적으로 확인할 수 있도록 했습니다.
- F Key 입력 게이지 기반 상자 열림 처리
- Tick에서 F Key 입력 상태를 확인하고, 입력 유지 시간에 따라 상호작용 게이지가 증가하도록 구현했습니다.
- 게이지가 모두 채워지면 상자가 열리는 애니메이션을 재생하도록 처리했습니다.
- ProjectileMovementComponent 기반 아이템 드랍 모션 구현
- 상자가 열릴 때 아이템을 생성하고 ProjectileMovementComponent를 활용하여 자연스럽게 튀어나오는 드랍 모션을 구현했습니다.
- 단순 생성 방식이 아니라 이동 방향과 속도를 부여하여 아이템 획득 연출의 시각적 완성도를 높였습니다.
Inventroy UI


구현 내용
- Inventory UI 구조 개선
- 기존에는 PlayerCharacter가 InventoryComponent를 직접 가지고 있고, Main UI와 연결되는 구조로 구현했습니다.
- 하지만 PlayerCharacter는 사망 시 소멸될 수 있기 때문에, 캐릭터가 사라질 경우 인벤토리 데이터가 함께 손실될 수 있는 문제가 있었습니다.
- PlayerState 기반 인벤토리 데이터 관리
- 개선 구조에서는 InventoryComponent를 PlayerState에서 관리하도록 변경했습니다.
- PlayerState는 플레이어 캐릭터가 사망하거나 재생성되더라도 유지되는 객체이기 때문에, 인벤토리 데이터를 안정적으로 보존할 수 있습니다.
- PlayerController와 HUD를 통한 UI 접근 구조 분리
- Main UI는 PlayerController에서 HUD를 통해 관리하도록 구성했습니다.
- 이를 통해 PlayerCharacter가 직접 UI를 관리하지 않도록 분리하여, 캐릭터 로직과 UI 로직의 의존성을 줄였습니다.
- 사망 이후에도 유지되는 인벤토리 시스템 구현
- 플레이어가 사망하여 PlayerCharacter가 소멸되더라도 PlayerState에 저장된 InventoryComponent는 유지됩니다.
- 따라서 캐릭터가 다시 생성되더라도 기존 인벤토리 데이터를 이어서 사용할 수 있도록 구현했습니다.
트러블 슈팅
문제 상황
초기에는 PlayerCharacter 내부에서 InventoryComponent를 관리하고, Main UI가 해당 컴포넌트를 참조하는 구조로 구현했습니다.
하지만 플레이어가 사망하거나 리스폰되는 상황에서 PlayerCharacter가 소멸되면, Character가 가지고 있던 InventoryComponent도 함께 사라지는 문제가 발생했습니다.
그 결과 플레이어가 보유하고 있던 아이템 데이터가 유지되지 않고 초기화되는 문제가 있었습니다.
원인 분석
PlayerCharacter는 실제 월드에 배치되어 움직이는 Pawn 객체이기 때문에, 사망이나 리스폰 과정에서 Destroy되거나 새로 생성될 수 있습니다.
따라서 장기적으로 유지되어야 하는 인벤토리 데이터를 Character에 직접 저장하면, Character의 생명주기에 따라 데이터가 함께 사라질 위험이 있었습니다.
해결 방법
인벤토리 데이터를 PlayerCharacter가 아닌 PlayerState에서 관리하도록 구조를 변경했습니다.
PlayerState는 플레이어의 상태 정보를 저장하는 역할을 가지며, Character가 사망하거나 재생성되더라도 비교적 안정적으로 유지될 수 있기 때문에 인벤토리 데이터를 보관하기에 적합하다고 판단했습니다.
또한 UI는 PlayerController와 HUD를 통해 접근하도록 변경하여, Character가 직접 UI를 관리하지 않도록 구조를 분리했습니다.
결과
PlayerCharacter가 사망 후 다시 생성되더라도 PlayerState에 저장된 InventoryComponent를 통해 기존 인벤토리 데이터를 유지할 수 있게 되었습니다.
이를 통해 캐릭터 생명주기와 인벤토리 데이터 생명주기를 분리할 수 있었고, UI와 캐릭터 로직 간의 의존성도 줄일 수 있었습니다.
'Unreal Project > Unreal Study' 카테고리의 다른 글
| Unreal StateTree로 NPC 대기와 순찰 AI 구현하기 (0) | 2026.06.08 |
|---|---|
| Unreal Engine Listen Server _ 03 ( 캐릭터 공격 구현 ) (0) | 2026.06.08 |
| Data_Asset 및 Quater View, Shoulder View 구현 (0) | 2026.02.26 |
| Unreal Collision에 관하여 (0) | 2025.10.31 |
| Animation 속도를 구간 별로 다르게 조절하는 방법 (0) | 2025.10.29 |