내일배움캠프 Unity 14일차 TIL - 팀 조랑말 - 인벤토리 구현

Wooooo·2023년 11월 16일
0

내일배움캠프Unity

목록 보기
16/94

오늘의 키워드

오늘부터 내일배움캠프 Chapter2의 팀 프로젝트 작업을 시작했다.
이전의 개인과제와 아주 유사한 구조의 Text Dungeon RPG 게임을 만든다.
나는 인벤토리 작업을 맡았다.


인벤토리 작업

개인 과제 때 썼던 인벤토리의 기능을 보강해서 가져와봤다.

Inventory Class

개인 과제 때의 Inventory

개인과제 때 썼던 인벤토리의 기능은 다음과 같다.

  • 필드, 프로퍼티
    • 아이템들을 저장할 리스트
    • 인벤토리의 주인을 가리킬 Parent 프로퍼티
  • 메서드
    • Add : 아이템 삽입
    • Remove : 아이템 삭제
    • GetItem : 해당 인덱스의 아이템 반환
    • HasSameItem : 중복 아이템이 있는지 검사
    • OrderBy : 인벤토리를 정렬

팀 과제에 적용하면서 변경점

1. Action, Indexer

이번에 팀 프로젝트에 적용하면서 보강한 기능은 다음과 같다!

  • 아이템이 삽입/삭제될 때 실행 될 Action 추가
  • 인덱서를 작성하여 []연산자를 이용해 내부 아이템에 접근
    • 기존에는 GetItem()을 이용해서 인벤토리 내부 아이템에 접근했었다.
    • []와 함께 for문 사용이 용이하게 내부 리스트의 Count를 반환받는 프로퍼티 추가
for (int i = 0; i < player.Inventory.Count; i++)
	SomethingMethod(player.Inventory[i]);

for문으로 인벤토리를 순회할 때 일반 List처럼 사용할 수 있게 해봤다.
또, 접근만 가능하고 리스트 내부의 순서는 바꿀 수 없게 인덱서의 setter를 숨겨뒀다.

        //List처럼 인덱싱.. ex) player.Inventory[0]
        public Item this[int idx]
        {
            get
            {
                if (idx < 0 || idx >= items.Count)
                    throw new ArgumentOutOfRangeException(nameof(idx));
                return items[idx];
            }
        }

2. Stackable Item, HasSameItem

팀 과제에서는 필수 구현사항에 개인 과제 때 없었던 소모품이 생겼다.
기존에는 장비만 있었기 때문에, 소모품의 특성에 맞는 추가 기능을 구현해야했다.

  • 인벤토리
    • 중복되는 아이템 삽입 시
      • 쌓을 수 있는 아이템이라면, 기존에 있던 아이템과 개수를 합침
      • 쌓을 수 없는 아이템이라면, 삽입이 무시됨
  • 아이템
    • StackCount 프로퍼티
      • nullable int로 선언해서, null이라면 쌓을 수 없는 아이템
    • 쌓을 수 있는 아이템
      • OnAdded 이벤트에 MergeItem()을 연결해서 두 아이템의 개수를 합치는 작업
Inventory.cs

        public void Add(Item item)
        {
            if (!HasSameItem(item, out Item res))
            {
                // 중복되는 아이템이 없는 경우만 add
                items.Add(item);
                item.OnAdd(Parent);
            }
            else if (res.StackCount.HasValue)
            {
                // 개수를 쌓을 수 있는 아이템이라면
                // 인벤토리에 있는 소모품의 stackCnt에 item의 stackCnt를 더함
                res.OnAdd(Parent, item);
            }
            onAdded?.Invoke(item);
        }
        
        public bool HasSameItem(Item item, out Item res)
        {
            for (int i = 0; i < items.Count; i++)
            {
                if (items[i].ID == item.ID)
                {
                    res = items[i];
                    return true;
                }
            }
            res = null;
            return false;
        }
Item.cs

        /// <summary>
        /// StackCount.HasValue가 null이라면 쌓을 수 없는 아이템
        /// </summary>
        public int? StackCount { get; protected set; }
ConsumeItem.cs

        public ConsumeItem(int id, string name, string description, int price, int stackCount) : base(id, name, description, price, stackCount)
        {
            OnAdded += MergeItem;
        }

        public void MergeItem(Character onwer, Item duplicatedItem)
        {
            // 중복된 아이템이 있을 경우 duplicatedItem로 받아옵니다.
            // duplicatedItem이 null이 아니라면 두 아이템의 개수를 합칩니다.
            StackCount += duplicatedItem is ConsumeItem consume ? consume.StackCount : 0;
        }

테스트

다행히 큰 오류 없이 잘 작동했다.


Git branch

오늘 git을 이용한 첫 협업을 진행해봤다.
팀원끼리 각자 구현할 부분을 분담해서 기능의 이름을 따서 branch를 만들어 작업하기로 했다.
나는 Inventory 구현을 맡았으니 Inventory branch를 만들어서 작업했다.

Inventory를 작업하다보니, Item.cs와 ConsumeItem.cs를 건드려야할 상황이 생겼는데, 이 두 클래스는 다른 팀원분께서 맡고 계셨다.
팀원분과 협의해서 내가 팀원분이 담당하신 branch로 가서 Item.cs와 ConsumeItem.cs에 필요한 작업을 진행했다.

팀원분의 branch에서 진행한 작업을 내가 담당한 Inventory branch로 가져와야했는데, 또 다른 팀원분이 알려주신 기능인 cherry-pick commit을 이용해서 가져와봤다.
다른 branch에서 진행된 commit을 몇개 찝어서 내 branch로 가져올 수 있는 기능인데, merge를 하지 않고도 다른 branch에서 작업한 코드를 동기화 할 수 있어서 정말 편리했다.

이외에도 merge pull request 하는 법이라던가, git을 처음 써보는 나에겐 팀원분들이 많은 도움을 주셨다.

profile
game developer

0개의 댓글