유니티 인벤토리 시스템 구현하기 #4[아이템 데이터 생성]
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();
}
- 제가 만들 아이템은 소모성아이템(포션)과 장비아이템(무기아이템) 입니다.
- 소모성아이템의 공통데이터를 관리할 CountableItemData 클래스는 ItemData 클래스를 상속받아 가지를 나눕니다.
- 장비아이템의 공통데이터를 관리할 EquipmentItamData 역시 ItemData 클래스를 상속받습니다.
-
ItemData 클래스는 Scriptable Object를 상속받아 유니티에서 애셋형태로 관리할 수 있도록 합니다.
- 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를 상속받아 클래스를 구현하면 나중에 관리가 용이해집니다.
- 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의 상단에서 포션 데이터를 만들 수 있도록 했습니다.
- 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)을 가집니다.
정리
- 현재까지 한것을 정리합니다.
- 먼저, 인벤토리 GUI를 만들었습니다.
- 인벤토리는 크게 두 부분으로 나뉩니다.
- HeaderArea : 마우스클릭으로 인벤토리창을 드래그 앤 드롭할 수 있는 부분입니다. Close 버튼도 함께 있습니다.
- MovableHeader 클래스를 컴포넌트로 가지고 있습니다.
2. ContentArea : 아이템들이 들어있는 슬롯 부분입니다. - 슬롯(Item Slot UI 프리팹)이 있으며 추후 ItemSlotUI 클래스를 컴포넌트로 가집니다.
- 인벤토리는 크게 두 부분으로 나뉩니다.
- 아이템 데이터를 만들었습니다.
- 아이템에는 크게 두가지 종류가 있습니다.
- CountableItemData : 소모성 아이템으로 소모성 아이템은 수량이 있습니다.
- PortionItemData : 포션아이템 데이터 2. EquipmentItemData : 장비 아이템으로 장비 아이템은 내구도가 존재합니다.
- WeaponItemData : 무기아이템 데이터
- 아이템에는 크게 두가지 종류가 있습니다.
댓글남기기