Adaid's Workroom

[MP] 프로토타입 제작 - 인벤토리 시스템 본문

프로젝트/개인 프로젝트

[MP] 프로토타입 제작 - 인벤토리 시스템

어데이드 2018. 4. 19. 01:28

18.04.17~18

기존에 짜던 코드 엎고 새출발

인벤토리 시스템 구현과 저장까지 완료

기획


헌트쿡의 인벤토리 시스템과 비슷하게 갈 예정이다.

위처럼 한 종류 아이템 99개가 인벤토리 한 칸을 차지

한 페이지당 일정 개수(12개)의 아이템을 보여주고 이 페이지를 확장시킬 수 있음


헌트쿡과 다른 점이 있다면 아이템 종류는 재료/일반약/특수약 세가지가 있으며 각각 인벤토리가 별개로 존재한다


구현 - 클래스 설계

public class ItemData
{
    public int itemId = 0;
    public int count = 0;
    ...
}

ItemData는 아이템 ID (나중에 이 값으로 DB에서 아이템 정보 불러올 예정) 와 갯수 (값은 99 이하)를 저장한다.


public class ItemInventory
{
    public List<itemdata> itemList = null;
    public int page = 0;

    public const int MaxItemCount = 99;
    public const int ItemPerPage = 12;
    public int capacity = 0;
    ...
}

itemList:  ItemData들을 리스트로 저장

아이템을 리스트에 넣을 때는 id 값이 오름차순으로 되게 넣는다.

page: 아이템 페이지 개수

MaxItemCount: 한칸당 아이템 최대 개수

ItemPerPage: 한페이지당 아이템 개수. 

capacity: 인벤토리의 최대 용량. 즉 이 값은 page * ItemPerPage가 된다. 

이 값은 저장되지 않아도 된다(게임 시작 or page값 변경시에만 계산하면 됨)


구현 - 인벤토리 시스템

역시 가장 시간과 노력이 많이 들었던게 인벤토리였던거 같다.

특히 아이템을 99개씩 나눠주는 방식을 제일 고민많이 하고 버그도 많이 났다.


시도1. 아이템의 총 보유 개수를 저장하는 방식

일단 각각의 ItemData의 count는 총 보유개수(아이템 최대개수인 99와 무관)로 저장하는 방식으로 해보기로 했다.

표시만 99개씩 잘라서 보여주면 되겠지 하면서 짰다.


장점은 특정 item의 개수를 바로 알 수 있고, 

아이템을 추가할때도 중복된 게 있으면 개수만 더해주고 중복된 게 없으면 맞는자리에 새로 넣어주면 되니 편하다.


근데 구현하고 나서 잠자리에 누워있다 깨달았다

99개씩 나눠서 표시할때 매우 복잡해진 다는 것을...


시도2. 99개별로 나눠서 저장하는 방식

시도1의 이유 때문에 ItemData의 count가 99개를 넘어가면 다음칸에 같은 아이템을 나눠서 만들어주는 방식으로 선회하였다.


    private void SetItemOver(int itemIndex)
    {
        ItemData targetItem = itemList[itemIndex];

        int repeat = (targetItem.count - 1) / MaxItemCount;

        for(int i = 0; i < repeat; i++)
        {
            int newItemCount = targetItem.count - MaxItemCount;
            targetItem.count = MaxItemCount;

            targetItem = new ItemData(targetItem.itemId, newItemCount);
            itemList.Insert(itemIndex + 1 + i, targetItem);
        }
    }


위 함수는 추가한 아이템의 인덱스 값을 받고 99개 이상이면 나눠주는 함수이다.

1~99개이면 0개

100~198개이면 1개

199~297 이면 2개....

번 추가해줘야 되므로 repeat 변수는 (타겟 아이템 개수 - 1) / 최대 아이템 개수가 된다.


그걸 이용해서 for문으로 

타겟 아이템 개수를 99개 만들고 

새로운 아이템을 만들어서 그 개수를 원래 타겟 아이템 개수-99로 하였다.

그리고 다음 타겟 아이템은 그 새로운 아이템이 된다

이걸 repeat만큼 반복한다.


구현한 후 자잘한 버그를 수정하여 완성하였다.


테스트 0. 원래 상태


테스트 1. 2번 아이템 40개 추가


테스트 2. 0번 아이템 150개 추가


테스트 3. 1번 아이템 100개 추가


테스트 4. 다시 1번 아이템 100개 추가


휴 끗

구현 - 저장

개인적으로 선호하는 json.net 에셋(에셋스토어 링크)으로 저장하였다.

바이너리 json인 bson으로 ItemInventory 저장


저장되지 않는 정보(capacity 등)는 [JsonIgnore]을 붙여주었다


저장&로드 잘되는것 테스트해서 확인 완료


하다가 든 생각들

- 다른 게임들은 어떤 식으로 구현할지 궁금하다.

내가 짠거랑 비슷하려나...


- 아이템 개수 확인하는 함수도 짰는데 테스트를 못해봄

제발 잘되라


- 나중에 아이템 정렬 기능도 넣으려면 최근에 얻은 시각도 정보에 넣어야 되려나?

그냥 id순으로 정렬하는게 편하긴 한디


- UML 다이어그램도 공부해야되는데 언제 하냐


Comments