오늘부터 내일배움캠프 Chapter2의 팀 프로젝트 작업을 시작했다.
이전의 개인과제와 아주 유사한 구조의 Text Dungeon RPG 게임을 만든다.
나는 인벤토리 작업을 맡았다.
개인 과제 때 썼던 인벤토리의 기능을 보강해서 가져와봤다.
개인과제 때 썼던 인벤토리의 기능은 다음과 같다.
이번에 팀 프로젝트에 적용하면서 보강한 기능은 다음과 같다!
GetItem()
을 이용해서 인벤토리 내부 아이템에 접근했었다.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];
}
}
팀 과제에서는 필수 구현사항에 개인 과제 때 없었던 소모품이 생겼다.
기존에는 장비만 있었기 때문에, 소모품의 특성에 맞는 추가 기능을 구현해야했다.
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를 만들어 작업하기로 했다.
나는 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을 처음 써보는 나에겐 팀원분들이 많은 도움을 주셨다.