💡 오늘의 핵심 배움 (Key Takeaways)
- 위젯 모듈화: 설정 창(Settings)을 독립된 위젯으로 분리하여 재사용성과 유지보수성 향상
- 입력 시스템 이해: Enhanced Input의 Started vs Triggered 차이 이해 및 일시정지(Paused) 상태에서의 입력 제어
- 디커플링(Decoupling): C++ 델리게이트(Delegate)를 활용한 데이터(HP/Ammo)와 UI(HUD)의 완벽한 동기화
1. 모듈화된 설정 창(Settings UI) 및 볼륨 저장 시스템 구축
🛠️ 구조 설계 및 기능 구현
- 독립된 위젯 모듈화: 일시정지 메뉴 위젯 안에 모든 설정 요소를 하드코딩하지 않고, WBP_Settings라는 독립된 위젯으로 분리함. 이를 통해 향후 메인 메뉴 등 다른 UI에서도 설정 창을 그대로 재사용할 수 있는 구조를 확립함.
- 볼륨 제어 로직: Set Sound Mix Class Override 노드를 사용하여 마스터 사운드 클래스(SC_Master)의 실시간 볼륨을 0% ~ 100% 범위로 제어함.
- 데이터 저장: USaveGame을 상속받은 C++ 클래스 USG_Settings를 활용하여, 게임 시작 시 디스크에서 저장된 볼륨 값을 성공적으로 불러오도록 구현함.
⚡ 트러블슈팅: 슬라이더 조절 시 화면 끊김(Stuttering) 현상
- 원인: 볼륨 슬라이더의 On Value Changed 이벤트에 디스크 저장(SaveGame) 로직을 연결했더니, 슬라이더를 드래그하는 매 프레임마다 세이브 파일 입출력이 발생하여 병목 현상이 생김.
- 해결: 실시간 볼륨 조절(사운드 믹스 변경)과 디스크 저장 시점을 분리함. 슬라이더 드래그 중에는 가벼운 사운드 믹스 변경만 수행하고, 마우스 클릭을 뗐을 때 발생하는 On Mouse Capture End 이벤트에서만 SaveGame이 단 한 번 실행되도록 최적화함.
2. UI 상태 관리 및 입력 버그 해결
⌨️ 트러블슈팅 1: 일시정지 시 입력 먹통 현상
- 문제: 게임 일시정지(Game Paused) 상태로 진입하면, 메뉴를 닫기 위한 키보드/마우스 입력까지 모두 차단되는 현상 발생.
- 해결: 일시정지 상태에서도 작동해야 하는 입력 노드는 디테일 패널에서 Execute when Paused(일시정지 중 실행) 옵션을 켜거나, 향상된 입력(Enhanced Input) 에셋 내부 설정에서 Trigger when Paused를 활성화해야 함을 인지하고 적용함.
🔄 트러블슈팅 2: 일시정지 토글 시 화면 깜빡임/무한 반복
- 원인: 입력 노드의 Triggered 실행 핀에 토글 로직을 연결함. Triggered는 키를 누르고 있는 매 프레임마다 이벤트를 방출하므로, 짧게 눌러도 수십 번의 토글이 발생해 위젯이 깜빡거림.
- 해결: 한 번 눌렸을 때 단 1회만 정확히 실행되는 Started 실행 핀으로 교체하여 버그를 수정함.
📚 위젯 레이어(Stack) 관리 구조화
- 일시정지 메뉴 위에 설정 창을 띄울 때 두 UI가 겹쳐서 오작동하는 것을 방지함.
- 플레이어 캐릭터 내부에 활성화된 위젯 레퍼런스(UI Settings)를 변수로 저장.
- P키나 뒤로 가기(Back) 입력이 들어오면 상위에 띄워진 위젯부터 차례대로 판별하여 지우거나 가시성(Set Visibility)을 끄는 방식으로 자연스러운 뒤로 가기(Depth 제어) 구조를 완성함.
3. C++ 체력 및 탄약 보급 시스템 동기화 (Health & Ammo C++ Sync)
🔗 트러블슈팅: 데이터와 UI의 동기화 실패
- 문제: 플레이어의 실시간 스탯(CurrentHP)이 변경되어도, 화면에 떠 있는 UI HUD의 체력바가 즉시 갱신되지 않는 구조적 결함을 발견함.
- 해결 (델리게이트 도입): AJ_GameMode에 UI 업데이트용 델리게이트(OnHealthChanged, OnAmmoChanged)를 선언하고, HUD 위젯 생성 시 이를 바인딩(Binding)함.
⚙️ C++ 연동 로직 최종 구현
- 체력 시스템: AJ_PlayerCharacter에 Heal() 함수 추가. TakeDamage()로 체력이 깎이거나 Heal()로 체력이 찰 때, AJ_GameMode를 캐스팅하여 OnHealthChanged.Broadcast()를 실행. 이를 통해 데이터 변경 즉시 UI 체력바가 갱신됨.
- 탄약 시스템: AJ_GameMode에 AddAmmo() 함수를 추가. 탄약을 획득하거나 소모할 때 델리게이트 브로드캐스트가 자동으로 실행되도록 중앙 집중화된 구조를 설계함.
- 아이템 획득 로직: 블루프린트로 오버랩(Overlap) 감지용 BP_HealthPack, BP_AmmoPack 아이템 액터를 제작하여, 플레이어가 닿았을 때 앞서 만든 C++ 함수들(Heal(), AddAmmo())을 호출하며 유기적으로 상호작용하도록 구현 완료함.
'본캠프 TIL' 카테고리의 다른 글
| 07.16 Unreal 본캠프) C++를 활용한 아이템 상속 설계와 투사체 무브먼트 연동 (0) | 2026.07.16 |
|---|---|
| 07.13 Unreal 본캠프) 일시정지 메뉴 연동 및 카메라 연출 (0) | 2026.07.13 |
| 07.09 Unreal 본캠프) 랜드스케이프(지형) 크기 줄이고 잘라내는 방법 (0) | 2026.07.09 |
| 07.08 Unreal 본캠프) 잠입 액션 시스템 설계와 객체 지향적 의사결정 (0) | 2026.07.08 |
| 07.07 Unreal 본캠프) Data Asset으로 재구성 (0) | 2026.07.07 |