티스토리 뷰

이번에는 인벤토리 시스템에 대해서 정리 해 볼 예정이다.


인벤토리의 시스템의 전체적인 구성

본작의 인벤토리는 총 3종류로 나뉜다.

  • Dungeon Inventory
    • 던전 탐색 중에 활용되는 인벤토리.
    • 던전 탐색 도중에만 유효한 임시 인벤토리로, 던전에서 나갈 경우에는 다음 과정을 거쳐서 초기화된다.
      • 사망으로 인하여 탈출하는 경우, '탈출 실패'로 간주하여 소지품과 소지금의 일부가 유실된다.
      • 탈출한 경우에는 모든 소지품과 소지금이 유지된다.
      • 위 과정의 끝에 남아있는 소지품과 소지금은 Village Inventory로 이동한다.
    • 본 인벤토리로 습득되는 아이템은 ItemLog가 표시된다.
  • Village Inventory
    • 마을에서 사용 가능한 인벤토리로, 보관함과 상호작용 시 이용 가능하다.
    • 인벤토리 UI는 사실상 본 인벤토리에만 존재한다.
      • 이로 인해서, 장비의 탈착은 마을에서만 사용할 수 있다.
    • 아이템은 Tag 별로 구분하여, 이 Tag 별로 필터를 적용하기 위한 추가 아이템 목록도 보유 중.
  • Result Inventory
    • 엄밀히 말하면 인벤토리는 아니고, 탐색 결과를 표시하기 위한 연결역할이다.
    • Dungeon Inventory에서 유실됬는지 유지됬는지를 담당한다.

이 탓에 아래에서 설명할 UI 부분은 Village Inventory에만 적용된다고 보면 된다.


인벤토리 UI의 전체적인 구성

인벤토리 UI는 다음 4가지로 구성되어 있다.

  • 인벤토리
    • 현재 보유 중인 아이템의 목록을 표시하는 UI.
    • Village Inventory의 ItemList를 참고하여 표시하는 역할을 한다.
    • 태그 필터가 존재하여, 필터 활성화 시 해당하는 아이템 만 표시된다.
      • 이 기능은 UI의 기능이 아니라 Village Inventory의 기능이다. UI는 표시 대상 만 바꾸도록 구성되어 있다.
    • 재사용 스크롤 뷰로 구성되어 있다.
      • [트러블 슈팅] 본래 Grid Layout Group과  SetSiblingIndex를 이용해서 구현하려고 했으나, 이 과정 속에서 스크롤의 정도를 UI 이동에 맞게 조정해야 했는데, 이렇게 구성하니 스크롤이 자연스럽게 되도록 만드는 것이 너무 복잡해서 방법을 바꿨다.
      • [현재] 현재 표시 중인 아이템 목록의 아이템 총 량에 맞춰서 ScrollRect의 Content의 크기를 지정한 뒤, 스크롤의 방향에 맞춰서 최상단 혹은 최하단의 아이템 UI를 반대쪽으로 이동시키면서 새로운 아이템에 맞게 갱신시키는 방식으로 구현.
    • 아이템 탈착 시, 탭을 변경할 시, 인벤토리 창을 열 떄에 상태가 갱신되도록 구성되어 있다
    • 아이템 목록의 아이템을 선택하여 해당 아이템의 아이템 정보를 표시할 수 있다.
  • 아이템 정보
    • 현재 선택 중인 아이템의 정보를 표시한다.
      • 이 때, 선택한 아이템의 종류에 따라서 바른 아이템 정보 UI를 활용하여 정보를 표시한다.
      • 단, '특성'은 전 아이템 공통으로 사용되기 때문에 아이템 종류에 관계 없이 동일하게 사용한다.
    • 선택 중인 아이템을 장착할 수 있다. 장착 시 선택 상태가 초기화되고, 본 UI가 닫힌다.
    • 선택 중인 아이템을 판매할 수 있다. 판매 시 해당 아이템의 가치 만큼 Gold가 증가하고, 아이템이 제거되며, 본 UI가 닫힌다.
    • 본 UI에 표시 중인 아이템은 배경이 노란색으로 표시되어 선택 상태인이 가시화된다.
  • 캐릭터 정보
    • 현재 플레이어 캐릭터의 종합 능력치를 볼 수 있다.
    • 장비 상태가 바뀔 경우 갱신된다.
  • 장비 현황
    • 현재 장착 중인 아이템이 표시된다.
      • 장착 중인 아이템은 인벤토리에서는 표시되지 않는다.
    • 장착중인 아이템의 상태가 변경될 경우 갱신된다.
    • 장착 중인 아이템을 선택하여 해당 아이템의 정보를 표시할 수 있다.

위 UI들은 상호간의 상호작용이 상당히 깊게 구성되어 있기 때문에, 4개 모두 하나의 프리팹으로 묶여서 구성하였다.

동시에 이를 묶어서 구성하는 컴포넌트를 하나 추가함으로써 GetComponent나 GameManager 참조 없이 서로 변수에 할당할 수 있도록 구성하였다.


 

 

번외. 아이템 로그

의외로 간단하게 구성되어 있다.

습득 아이템의 List를 제작한 뒤, 습득한 아이템의 정보를 이 List에 넣고, 정보가 List에 들어가고 일정 시간 뒤에 자동으로 List의 첫 노드가 제거되게끔 구성하고, 이에 맞춰서 UI를 갱신하도록 구성하였다.

여기에 최대 갯수를 정해서 그 이상이 되면 또 첫 노드가 제거되게끔 구성하는 것으로 작성 완료.

 

처음에는 Vertical Layout Group과 Object Pool을 이용해서 구현했으나, 인벤토리를 작업하다가 '이것도 유사 방식으로 구현 가능하지 않나?' 싶어서 방법을 바꿨다. 이쪽이 최적화 상으로도 더 좋을 거 같기도 했다.

다만, 아마 습득 정보가 습득 위치에서 표시되는 방식이었다고 한다면 Object Pool을 이용해야 할 것이다.


인벤토리는 재 작업 한 부분도 재사용 스크롤 뷰 밖에 없었다는 점에서  전체적으로 버벅였다기 보다는 할 게 많았다는 느낌이었다.

실제로 이 시스템을 제작하면서 장비 시스템도 같이 작업했고, 추가로 아이템 습득 시스템과 캐릭터 정보를 손 보는 등, 관련된 시스템이 많아서 전체적으로 오래 걸렸던 거 같다.

 

본인의 파트는 이것과 필드 절차적 생성까지다. 이후에는 공통 과정으로서 프로젝트의 마무리를 할 예정이다.

이제 슬슬 프로젝트의 마무리가 다가오고 있다. 

시간은 조금 촉박한 거 같지만... 열심히 마무리 지어서, 만족스러운 결과를 맞이하기를 바래 본다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함