3 분 소요

Intro

  • 이번 포스팅에서는 인벤토리에 들어갈 아이템 및 아이템 데이터 구현을 정리하려합니다.

  • 아이템은 각 아이템마다 개별적으로 가질 데이터와 공통으로 가질 데이터가 존재합니다.

  • Item 클래스는 각각의 아이템을 의미하고, 데이터를 관리할 클래스이고

  • ItemData 클래스는 공통 데이터를 관리할 클래스입니다.

ItemData 클래스

  • ItemData 클래스는 아이템들이 공통적으로 가질 데이터를 관리할 클래스입니다.

  • 공통적으로 가질 데이터에는 아이템 이름, 아이콘, 툴팁 등이 있습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/*
        [상속 구조]

        ItemData
            - CountableItemData
                - PortionItemData
            - EquipmentItemData
                - WeaponItemData
 */ 

public abstract class ItemData : ScriptableObject
{
    public int ID => id;                        
    public string ItemTooltip => itemTooltip;
    public string ItemName => itemName;
    public Sprite ItemICon => itemIcon;         


    [SerializeField] private int id;                // .. 아이템 ID
    [SerializeField] private string itemName;       // .. 아이템 이름
    [TextArea]
    [SerializeField] private string itemTooltip;    // .. 아이템 툴팁 
    [SerializeField] private Sprite itemIcon;       // .. 아이템 아이콘

    /// <summary>타입에 맞는 새로운 아이템 생성 /// </summary>
    public abstract Item CreateItem();
}

  1. 제가 만들 아이템은 소모성아이템(포션)과 장비아이템(무기아이템) 입니다.
    • 소모성아이템의 공통데이터를 관리할 CountableItemData 클래스는 ItemData 클래스를 상속받아 가지를 나눕니다.
    • 장비아이템의 공통데이터를 관리할 EquipmentItamData 역시 ItemData 클래스를 상속받습니다.
  2. ItemData 클래스는 Scriptable Object를 상속받아 유니티에서 애셋형태로 관리할 수 있도록 합니다.

  3. CreateItem 메소드는 개별 아이템을 관리하는 클래스에서 구현하여 아이템을 생성할 수 있도록 합니다.

Item 클래스

  • Item 클래스는 아이템의 실체로, 아이템들의 동작들을 구현합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/*
        상속 구조
        Item : 아이템
            - EquipmentItem : 장비 아이템
            - CountableItem : 수량이 있는 아이템
 */
public abstract class Item 
{
    public ItemData Data { get; private set; }

    // .. ItemData로 초기화
    public Item(ItemData data) => Data = data;
}

하위 클래스들

  • 먼저 ItemData를 상속받아 개별 데이터를 관리할 클래스들을 만들어줍니다.

  • 크게 2가지 아이템 종류가 있으므로(소모성, 장비) 각각의 클래스를 만들어줍니다.

CountableItemData 클래스

  • CountableItemData 클래스는 소모성(수량이 있는)아이템이 가질 데이터를 관리합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// .. 수량이 있는 아이템 데이터
public abstract class CountableItemData : ItemData
{
    // .. 최대 갯수
    public int MaxAmount => maxAmount;

    [SerializeField] private int maxAmount = 99;
}

  • 소모성 아이템이 가질 공통데이터로 수량이 있을겁니다. 인벤토리 슬롯 한칸에 최대 99개까지만 들어간다고 생각하고 최대갯수를 99개로 했습니다.

EquipmentItemData 클래스

  • EquipmentItemData 클래스는 장비 아이템이 가질 데이터를 관리합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public abstract class EquipmentItemData : ItemData
{
    // .. 최대 내구도
    public int MaxDurability => maxDurability;

    [SerializeField] private int maxDurability = 100;
}

  • 장비 아이템이 가질 공통데이터로 내구도가 있을겁니다. 최대 내구도를 100으로 잡았습니다.
개별 아이템 데이터들
  • 이제 소모성 아이템은 CountableItemData를, 장비 아이템은 EquipmentItemData를 상속받아 클래스를 구현하면 나중에 관리가 용이해집니다.
  1. PortionItemData 클래스
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "Item_Portion_", menuName = "Inventory System/Item Data/Portion", order = 3)]
public class PortionItemData : CountableItemData
{
    public float Value => value;

    [SerializeField] private float value;           // .. 회복량

    public override Item CreateItem()
    {
        return new PortionItem(this);
    }
}

  • 아이템 - 소모성아이템 - 포션아이템 클래스입니다.
  • 포션을 소비했을 때 캐릭터가 회복할 회복량(value)을 가지고있습니다.
  • CreateItem 메소드는 새로운 포션아이템을 생성합니다.
  • CreateAssetMenu를 통해 에디터에서 우클릭-Create의 상단에서 포션 데이터를 만들 수 있도록 했습니다.

image

  1. WeaponItemData 클래스
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "Item_Weapon_", menuName = "Inventory System/Item Data/Weaopn", order = 1)]
public class WeaponItemData : EquipmentItemData
{
    private int Damage => damage;

    [SerializeField] public int damage = 1;         // .. 데미지

    public override Item CreateItem()
    {
        return new WeaponItem(this);
    }
}

  • 아이템 - 장비아이템 - 무기아이템 클래스입니다.
  • 무기아이템은 공격력(damage)을 가집니다.

정리

  • 현재까지 한것을 정리합니다.
  1. 먼저, 인벤토리 GUI를 만들었습니다.
    • 인벤토리는 크게 두 부분으로 나뉩니다.
      1. HeaderArea : 마우스클릭으로 인벤토리창을 드래그 앤 드롭할 수 있는 부분입니다. Close 버튼도 함께 있습니다.
      • MovableHeader 클래스를 컴포넌트로 가지고 있습니다.
        2. ContentArea : 아이템들이 들어있는 슬롯 부분입니다.
      • 슬롯(Item Slot UI 프리팹)이 있으며 추후 ItemSlotUI 클래스를 컴포넌트로 가집니다.
  2. 아이템 데이터를 만들었습니다.
    • 아이템에는 크게 두가지 종류가 있습니다.
      1. CountableItemData : 소모성 아이템으로 소모성 아이템은 수량이 있습니다.
      • PortionItemData : 포션아이템 데이터 2. EquipmentItemData : 장비 아이템으로 장비 아이템은 내구도가 존재합니다.
      • WeaponItemData : 무기아이템 데이터

댓글남기기