Unity - 최종 프로젝트 FPS게임 만들기

한예준·2025년 7월 2일

정말 오랜만에 TIL을 작성하는 듯 싶다. 마지막으로 TIL을 작성한 날로부터 약 1달이 넘게 지나간 것 같은데 그 동안 팀 프로젝트 2개와 개인 프로젝트 하나를 추가로 진행했고, 이제 약 8주간 진행될 최종 프로젝트를 진행하고 있다.

현재 나는 최종 프로젝트에서 Sound와 UI 작업을 진행하고 있고, 현재 HUD의 기능들을 조금 더 다듬고 있다. 추후 맵의 환경요소들 (조작 패널이나 사다리 등)을 제작할 예정이고, 오늘부터 다시 매일의 진행 사항을 기록하며 정리해보는 시간을 가져보겠다.


UI 작업

기존 UI 작업 내용

전체 구조

  • UI Manager가 Addressables로 씬별 UI 프리팹을 로드·관리 → 캔버스에 띄워주는 구조를 구현했다.
  • UIBase 추상 클래스로 UI의 공통 인터페이스를 정의했다.
  • InGameUI는 플레이어 상태, 스킬 게이지, 크로스 헤어, 무기 정보를 실시간으로 업데이트하도록 연결한다.
  • LowHealthOverLay, CrosshairController, PauseHandler등의 각 UI 프리팹 스크립트들은 피해 효과, 조준 및 발사 효과, 일시정지 등 각종 부가적인 효과를 담당한다.

오늘 UI 작업 내용

기존 UI 개선

  • CrosshairController 개선
    • 기존 단일 코루틴 관리에서 발사 중단 시 남아 있는 코루틴이 있을 경우 해당 코루틴만 중단 후 정상적으로 축소 애니메이션이 실행되도록 코루틴 핸들을 이용토록 수정했다.
  • Lobby UI
    • 메인 메뉴에서 New Game 선택 시 저장된 데이터가 아닌 새 게임을 시작하는지 묻는 팝업UI를 띄우도록 수정하였다.
  • HUD
    • 에셋에 있는 애니메이션 효과 등을 UI 프리팹에 적용해보았다.

무기 선택 UI 제작

WeaponUI는 플레이어가 장착한 무기들을 슬롯 형태로 표시하고, 선택된 슬롯에 대해 크기, 색상, 애니메이션 등을 변화시키는 컴포넌트이다.

  • WeaponUI

    • 필드 구성(헤드)

      • SlotType 배열: 표시할 슬롯 순서 및 종류 정의
      • Slot: 각 슬롯의 RectTransformAnimator를 배열로 관리
      • WeaponInfo: 무기 아이콘, 이름 텍스트, 탄약 아이콘, 탄약 개수 텍스트
      • Scale 세팅: 비선택 시 normalSize 선택 시 selectedSize, 슬롯 선택 시 확대 보간 속도 scaleSpeed
      • Color 세팅: 선택/비선택 알파값 및 텍스트 색상 조정
        [SerializeField]로 설정하여 에디터 상에서 조정 가능하도록 했다.
    • Update

      • 매 프레임 현재 크기와 목표 크기 간 차이를 확인
      • 슬롯 선택 시 Vector3.Lerp로 부드럽게 확대
      • 레이아읏이 변경되면 LayoutRebuilder.ForceRebuildLayoutImmediate를 호출
    • Refresh

      • 장착된 무기 리스트, 사용 가능 여부 리스트, 현재 선택된 인덱스를 받아서 처리한다.

      • 인덱스가 유효하고 사용 가능할 경우
        슬롯별로 해당 슬롯 타입에 맞는 무기를 검색하고, 아이콘 색상을 조정하고, 이름 및 탄약 텍스트를 표시한다. 슬롯이 선택된 경우에만 보이도록 enabled를 토글한다.
        슬롯 선택 시 selectedSlotAlpha, 비선택 시 idleAlpha를 슬롯 이미지에 적용한다.
        변화될 크기도 설정한다.

      • 이전 선택 슬롯 (prevSelectedSlot)과 현재 슬롯 (currentSelectedSlot)이 다르면 슬롯을 빛나게 하는 애니메이션을 실행하는 이전 슬롯의 애니메이터를 해제하고 새 슬롯의 애니메이터를 활성화한다.

    • IsMatchSlot

      • 각 슬롯에 해당 타입의 무기가 들어가도록 체크한다.
    • GetWeaponName

      • 각종 무기의 이름을 받아오는 역할을 한다.

추후 작업 계획

  • UI 기능확대
    • InventoryUI, HackingUI, WeaponModifyUI 등을 추가하여 게임의 각 기능에 맞는 UI 프리팹을 제작하고 바인딩 할 예정이다.
    • 기획자 분들과의 소통을 통해 수정할 필요가 있는 UI들은 지속적으로 개선 및 확장할 예정이다.
  • 맵 환경요소 제작
    • 특정 오브젝트와 상호작용 하면 문이 열리거나, 미니게임을 할 수 있는 기능을 만들 예정이다.
    • 또한 함정, 사다리 등의 기능이 있는 맵 환경요소들을 계속 추가해 나갈 예정이다.

트러블 슈팅

1. 슬롯 크기 변경 시 자식 오브젝트가 같이 커지지 않는 문제

  • 원인: VerticalLayoutGroup에 Use Child Scale → Height 옵션이 꺼져 있어서, 자식 localScale이 레이아웃 계산에 반영되지 않았다.
  • 해결:
    • VerticalLayoutGroup → Control Child Size → Height 및 Use Child Scale → Height 모두 활성화
    • WeaponUI에서 slotTransform[i].localScaleVector3.Lerp로 애니메이션하도록 전환

2. 레이아웃이 갱신되지 않는 문제

  • 원인: LayoutRebuilder.ForceRebuildLayoutImmediate()에 잘못된 부모(layoutParent)를 넘겨줌
  • 해결:
    • LayoutRebuilder에 전달할 RectTransform을 VerticalLayoutGroup이 붙은 컨테이너(WeaponLayout)로 수정
    • 부모를 정확히 지정한 뒤, 크기 애니메이션이 실행될 때마다 레이아웃을 재계산

3. 선택된 슬롯 외 텍스트(이름·탄약)가 모두 보이는 현상

  • 해결:
    • slotText[i].enabled = isSelected
    • slotAmmoText[i].enabled = isSelected && slotAmmoImage[i].enabled
    • 선택된 슬롯에서만 텍스트가 활성화되도록 토글

회고 및 느낀점

  • 캠프에서 뛰어난 실력을 가지신 팀원분들과 함께 프로젝트를 진행하게 되었는데, 내 실력이 팀원분들에 비해 낮아서 작업 진행 속도가 느린 점이 안타깝다.
  • 또 지금까지 개인 프로젝트를 진행하면서 채택했던 방식 (UI 바인딩 시 이벤트를 사용하는 등)이 팀 프로젝트에선 불리한 선택일 수 있다는 걸 알게 되어 팀 프로젝트를 진행하는 데에 알맞는 방식을 채택하도록 노력해야겠다.
  • 반면 그만큼 팀원분들로부터 많은 걸 배울 수 있어서 캠프 막바지에 좋은 기회를 잡았다고 생각한다.
  • 이번 프로젝트를 진행하는 동안 지금까지는 UI, Sound 등의 작업을 진행했지만, 조금 더 노력해서 게임 주요 시스템들도 건드려 보고 싶다는 생각이 있다.

0개의 댓글