[내일배움캠프 TIL] 28. 아이템과 인벤토리

2023. 10. 24. 21:45내일배움캠프 Unity

[최종프로젝트 1]

오늘부터 내일배움캠프 최종프로젝트에 들어간다.

팀원들과의 회의로 패링을 주로 사용하는 2D 소울라이크 게임을 만들기로 했고 그 중 나는 아이템과 인벤토리에 관련 된 부분을 전담하게 되었다.

 

아이템 기능을 원활하게 테스트 하기 위해 인벤토리가 필요할 것이라 생각했기에 오늘 작업은

1. 인벤토리 창 제작

2. 인벤토리 슬롯 자동 배치 및 활성화 기능

3. 스크립터블 오브젝트를 사용한 아이템 데이터베이스 관리

4. 필드 아이템(드랍된 아이템) 획득 및 인벤토리에 적용

5. 인벤토리의 아이템 사용

순서로 진행했으며 마지막으로 겪었던 어려움과 버그 픽스에 대해 기록 할 것이다.

 

1. 인벤토리 창 제작

  • ScrollView를 이용해 인벤토리 창과 슬롯을 만들었다.
  • 키보드 I 키를 눌러 인벤토리를 쉽게 켜고 끌 수 있게 만들었다. 

 

2. 인벤토리 슬롯 자동 배치 및 활성화 기능

  • Grid LayOut Group과 Content Size Filter를 연계해 인벤토리의 슬롯을 정렬시키고 슬롯 개수에 따라 인벤토리의 스크롤 길이가 유동적으로 변하도록 구현했다.
  • 초기에 사용 가능한 슬롯 개수를 제한하고 특정 조건 만족 시 사용 가능한 슬롯이 늘어나도록 구현했다.(현재는 + 버튼 클릭)

 

3. 스크립터블 오브젝트를 사용한 아이템 데이터베이스 관리

  • 스크립터블 오브젝트를 사용해 아이템의 기본적인 데이터 값을 관리하고 해당 데이터 값을 복사해 사용한다.
  • Position은 이후 박스 등 파괴 가능한 오브젝트 위치로 설정할 예정

 

4. 필드 아이템(드랍된 아이템) 획득 및 인벤토리에 적용

  • 플레이어가 충돌한 오브젝트의 태그가 FieldItem일 경우 아이템을 사라지게 만들고 해당 아이템을 획득한다.
  • 필드 아이템 획득 시 순서대로 인벤토리에 들어가도록 구현

 

 

5. 인벤토리의 아이템 사용

  • OnPointerUp() 을 사용해 마우스 클릭 후 손을 뗄 때 아이템을 사용하고 인벤토리를 재구성한다.
  • Use() 에선 스크립터블 오브젝트와 추상클래스를 사용해 아이템 별 효과를 다르게 구현했다.
  • RemoveSlot()과 UpdateSlotUI()는 사용한 아이템을 인벤토리 데이터에서 삭제하고슬롯들이 가진 아이템 정보를 초기화하고 인벤토리 데이터에 있는 아이템들로 다시 배치한다. 결과적으로 사용한 아이템을 제외한 아이템들이 첫 번째 슬롯부터 차례로 배치된다.

 

6. 버그픽스

  • Serializable 클래스가 인스펙터 창에 보이지 않음
    • MonoBehavior 상속을 삭제하여 해결
  • 아이템 사용 버그
    • 간헐적으로 사라진 item에 접근하여 오류 발생
    • 아이템을 바로 사용하는 것이 아니라 info 패널을 띄워주는 것으로 해결(아이템 정보, 착용, 사용, 해제 등 선택창)