✅ 기능
아이템을 관리하기위해 아이템 데이터를 저장할 곳이 필요합니다. Unity에서 제공하는 ScriptableObject를 이용하여 데이터로만 사용하는 Item이라는 클래스를 구현하고, 정리해보았습니다.
🔨 로드맵
[📌현재 글] 2. 유니티 인벤토리 시스템(2) - 아이템(ScriptableObject)
3. 유니티 인벤토리 시스템(3) - 아이템 슬롯(인벤토리 슬롯)
5. 유니티 인벤토리 시스템(5) - 아이템 슬롯 관리
✅ 응용 기능
✅ 구현
1. Item
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Flags]
public enum ItemType // 아이템 유형
{
/// <summary>
/// NONE Type은 아이템을 습득하기위해 E키를 누른경우, 인벤토리에 들어오지 않는다.
/// 특별한 상호작용이 있는 오브젝트로 취급한다.
/// </summary>
NONE = 0b0, //0
SKILL = 0b1, //1
//장비 아이템 영역
//장비 아이템 타입에서 추가되는경우, 증가하는 값으로 추가한다.
Equipment_HELMET = 0b10, //2
Equipment_ARMORPLATE = 0b100, //4
Equipment_GLOVE = 0b1000, //8
Equipment_PANTS = 0b10000, //16
Equipment_SHOES = 0b100000, //32
//장비 아이템이 아닌 아이템들(소모, 기타, 재료, 퀘스트아이템 등등)
Etc = 0b1000000, //64
Consumable = 0b10000000, //128
Ingredient = 0b100000000, //256
Quest = 0b1000000000, //512
}
[CreateAssetMenu(fileName = "Item", menuName = "Add Item/Item")]
public class Item : ScriptableObject // 게임 오브젝트에 붙일 필요 X
{
[Header("고유한 아이템의 ID(중복불가)")]
[SerializeField] private int mItemID;
/// <summary>
/// 아이템의 고유 번호
/// </summary>
/// <value></value>
public int ItemID
{
get
{
return mItemID;
}
}
[Header("아이템의 중첩이 가능한가?")]
[SerializeField] private bool mCanOverlap;
/// <summary>
/// 아이템이 중첩이 가능한가?
/// </summary>
/// <value></value>
public bool CanOverlap
{
get
{
return mCanOverlap;
}
}
[Header("사용(상호작용)이 가능한 아이템인가?")]
[SerializeField] private bool mIsInteractivity;
/// <summary>
/// 사용(상호작용)이 가능한 아이템인가?
/// </summary>
/// <value></value>
public bool IsInteractivity
{
get
{
return mIsInteractivity;
}
}
[Header("아이템을 사용하면 사라지는가?")]
[SerializeField] private bool mIsConsumable;
/// <summary>
/// 아이템을 사용하면 한개씩 사라지는가?
/// </summary>
/// <value></value>
public bool IsConsumable
{
get
{
return mIsConsumable;
}
}
[Header("아이템을 사용시 쿨타임")]
[SerializeField] private float mItemCooltime = -1;
/// <summary>
/// 아이템의 쿨타임
/// </summary>
/// <value></value>
public float Cooltime
{
get
{
return mItemCooltime;
}
}
[Header("아이템의 타입")]
[SerializeField] private ItemType mItemType;
/// <summary>
/// 아이템의 유형
/// </summary>
/// <value></value>
public ItemType Type
{
get
{
return mItemType;
}
}
[Header("인벤토리에서 보여질 아이템의 이미지")]
[SerializeField] private Sprite mItemImage;
public Sprite Image
{
get
{
return mItemImage;
}
}
}
- ScriptableObject를 상속받는 클래스입니다. 데이터로써 사용되며 컴포넌트로 사용될 수 없습니다.
[CreateAssetMenu(fileName = "Item", menuName = "Add Item/Item")]
- CreateAssetMenu는 ScriptableObject 속성을 가지는 데이터 에셋을 생성할 수 있도록 해줍니다.
public enum ItemType {}
- 아이템의 타입입니다.
- 타입은 여러개가 선택될 수 있습니다. (소모품이면서 퀘스트 아이템 등.)
[SerializeField] private int mItemID;
public int ItemID {}
- 해당 아이템의 ID입니다. ID는 고유해야하며, 중복되어서는 안됩니다.
[SerializeField] private bool mCanOverlap;
public bool CanOverlap{}
- 아이템이 중첩 가능한지 설정하는 변수입니다.
- 예시로, 장비아이템은 중첩불가, 포션같은 소모성 아이템 등은 중첩이 가능하게 할 수 있습니다.
[SerializeField] private bool mIsInteractivity;
public bool IsInteractivity{}
- 아이템에 대해 상호작용(또는 사용)이 가능한지 설정하는 변수입니다.
[SerializeField] private bool mIsConsumable;
public bool IsConsumable{}
- 아이템을 상호작용(또는 사용)하면 사라지는지 설정하는 변수입니다.
[SerializeField] private float mItemCooltime = -1;
public float Cooltime{}
- 아이템을 상호작용(또는 사용)하면 다음 사용까지 기다려야하는 쿨타임을 설정하는 변수입니다.
[SerializeField] private ItemType mItemType;
public ItemType Type{}
- 아이템의 타입입니다. Flags로 설정하여 중복으로 선택이 가능하도록 구현하였습니다.
- 특정한 아이템슬롯에 넣을 수 있는지 마스크와 상호작용(또는 사용)시 여러 조건을 확인하기위해 사용합니다.
[SerializeField] private Sprite mItemImage;
public Sprite Image{}
- 인벤토리에 아이템이 있을경우, 해당 이미지를 보여주기 위한 변수입니다.
✅ 사용(적용) 예시
- 메뉴에서 아이템을 생성합니다. 또는 프로젝트 창에서 생성할 수 있습니다.
- 생성된 에셋파일을 적절하게 설정해줍니다.
- 해당 아이템(HP Potion)의 ID는 0이고, 사용이 가능하며, 중첩이 가능하고 사용시 소모되도록 하였습니다.
'unity game modules' 카테고리의 다른 글
[유니티] 인벤토리 시스템(4) - 아이템 획득 (0) | 2022.12.26 |
---|---|
[유니티] 인벤토리 시스템(3) - 아이템 슬롯(인벤토리 슬롯) (0) | 2022.12.26 |
[유니티] 인벤토리 시스템(1) - 인벤토리 관리자 (0) | 2022.12.26 |
[유니티] 3D World, Sprite Ordering Layer (0) | 2022.12.23 |
[유니티] 애니메이션 랜덤으로 재생하기(StateMachineBehaviour) (0) | 2022.11.23 |