내일배움캠프/TIL

유니티 숙련주차 팀 프로젝트 - 제작 시스템 추가

서보훈 2024. 11. 1. 20:18

제작 시스템과 인벤토리 기반을 완성하였습니다.

※ 아직 TMP에 한글폰트를 추가하지 않아서 글자가 모두 깨집니다.

 

제작에 필요한 아이템이 인벤토리에 있으면 제작 UI에 제작 가능한 아이템 목록이 나타나며, 이때 제작 가능한 아이템의 아이콘을 클릭하면 제작 재료 정보와 함께 제작 버튼이 활성화되도록 만들었습니다.

 

또한, 인벤토리에서 아이템 선택시, 상단에 아이템 정보를 출력하는 시스템을 제작하였습니다.

 

필요한 작업

인벤토리는 플레이어파트를 당담한 팀원분에게 요청하여 파사드 패턴인 Player 클래스에서 접근 가능하도록 했습니다.

단, 아직 제작시스템, 인벤토리 UI를 여는 입력이 완성되지 않았기 때문에 임시로 Update를 통해서 실시간으로 인벤토리를 확인하고, 제작 가능한 목록을 확인하고 있습니다.

이 부분에서 해야할 작업 목록입니다.

  • 제작창을 열 때, 제작 가능 목록 확인하게 만들기
  • 인벤토리에 아이템이 추가, 제거될 때 제작 가능 목록 확인하게 만들기
  • 크래프팅 시스템을 당담하는 클래스를 어디에 붙일지 정하기

인벤토리 아이템 선택시, 아이템의 스텟 정보를 표기하는 방식을 전략패턴을 사용하여 구현하고자 하였습니다.

아이템 데이터를 저장하는 스크립터블 오브젝트에 전략 패턴을 저장하는 방식을 사용하고자 했으나, public 으로 지정한 인터페이스가 인스펙터창에 나오지 않아서 임시로 이렇게 구현하였습니다.

public void SetItemInfo()
{
    if (curSelectSlot < 0) return;
    ItemData data = invenItems[curSelectSlot].slotItem;

    itemNameText.text = data.itemName;
    itemDescriptionText.text = data.description;
    itemIcon.enabled = true;
    itemIcon.sprite = data.icon;

    IItemInfoStrategy infoStrategy;
    switch(data.itemType)
    {
        case ItemType.Equipable:
            infoStrategy = new EquipInfo();
            break;
        case ItemType.Consumable:
            infoStrategy = new ConsumableInfo();
            break;
        default:
            infoStrategy = new NoneInfo();
            break;
    }

    itemStatText.text = infoStrategy.ItemInfoText(data);
}

→ TIL 작성중 생각난 내용 : ItemDatabase 스크립터블 오브젝트를 사용해서 아이템에 ID를 부여하고 아이템 정보를 저장중인데 ID를 부여할 때 아이템 타입을 확인해서 스위치문으로 전략패턴에 클래스를 붙여주면 해결되지 않을까?

 

아이템 정보를 표기할때, 아이템의 타입을 확인해서 스텟 정보를 어떻게 표기할지를 결정합니다.

NoneInfo 전략을 사용할경우 스텟에 아무것도 표기하지 않습니다.

더보기

전략 패턴 인터페이스와 클래스들

public interface IItemInfoStrategy
{
    string ItemInfoText(ItemData data);
}

public class EquipInfo : IItemInfoStrategy
{
    public string ItemInfoText(ItemData data)
    {
        string str = string.Empty;

        for (int i = 0; i < data.equipDatas.Length; i++)
        {
            switch (data.equipDatas[i].statusType)
            {
                case StatusType.Attack:
                    str += $"공격력 : {data.equipDatas[i].value} ";
                    break;
                case StatusType.Defence:
                    str += $"방어력 : {data.equipDatas[i].value} ";
                    break;
                case StatusType.Health:
                    str += $"최대체력 : {data.equipDatas[i].value} ";
                    break;
                case StatusType.Stamina:
                    str += $"최대 스테미나 : {data.equipDatas[i].value} ";
                    break;
                case StatusType.Speed:
                    str += $"이동속도 : {data.equipDatas[i].value} ";
                    break;
                case StatusType.TemResist_Low:
                    str += $"저온저항 : {data.equipDatas[i].value} ";
                    break;
                case StatusType.TemResist_High:
                    str += $"고온저항 : {data.equipDatas[i].value} ";
                    break;
            }

            if(i == 2)
            {
                str += "\n";
            }
        }

        return str;
    }
}

public class ConsumableInfo : IItemInfoStrategy
{
    public string ItemInfoText(ItemData data)
    {
        string str = string.Empty;
        for (int i = 0; i < data.consumableDatas.Length; i++)
        {
            switch (data.consumableDatas[i].consumType)
            {
                case ConsumableType.Health:
                    str += $"체력 회복 : {data.consumableDatas[i].value} ";
                    break;
                case ConsumableType.Hunger:
                    str += $"배고픔 회복 : {data.consumableDatas[i].value} ";
                    break;
                case ConsumableType.Water:
                    str += $"갈증 회복: {data.consumableDatas[i].value} ";
                    break;
                case ConsumableType.Buff:
                    str += $"버프지속시간 : {data.consumableDatas[i].value} ";
                    break;
            }
                    
        }

        return str;
    }
}

public class NoneInfo : IItemInfoStrategy
{
    public string ItemInfoText(ItemData data)
    {
        return string.Empty;
    }
}

해야하는 작업

  • 장착 아이템 추가
    • 장착 관련으로, 장착중인 아이템 스텟을 관리하는 클래스를 추가해야하나?
    • → 캐릭터 버프 매니저를 만들어서 플레이어한테 붙여주고, 소모품으로 인한 버프, 장착 아이템으로 인한 스텟 증가를 여기서 다 관리하게 만들자
    • 이후 캐릭터 버프 매니저에서 끌어서 플레이어한테 스텟 적용해달라고 하면되니... 프로퍼티로 내용 쉽게 끌고가게 하면 큰 문제는 없을것 같은데
    • 어...버프관련 UI 내가 만드는게 좋으려나?
  • 장착 슬롯 추가
  • 아이템 장착 버튼 추가
  • 자원 획득 오브젝트들 제작
  • 채집형 자원 오브젝트 제작

해보고 싶은 작업

  • 제작시, 제작 요구 가구 추가
    • 제작 요구 가구 근처에 있을때 플레이어에게 제작 레벨을 부여하고, 제작 아이템에 필요 제작 레벨을 정해주면 가능하지 않을까?
  • 창고 제작
    • 음...집 근처 창고하고 제작 시스템 연동되도록 제작해보고 싶은데...
    • 제작 관리 클래스에 창고 리스트를 만들고, 각 창고에 아이템 뭐 들고있는지 디렉토리 넣고 가져와서 관리...
    • 창고를 찾을 범위 기준을 플레이어로 해야하나 집터를 기준으로 해야하나...
    • 제작 시도시 창고를 우선적으로 사용할 수 있도록 만들기?
    • 창고 리스트에서 가장 위부터 딕셔너리 체크, 필요 갯수만큼 아이템 차감, 아이템 모두 차감되면 반복 종료
    • 차감이 완료되지 않으면 다음 창고 딕셔너리 체크... 일단 기반 전부 완료하면 시도해보기
  • 장비 아이템 기믹 추가?