유니티 RPG - 20. 소모성 아이템 만들기
Intro
이번 포스팅에서는 소모성 아이템을 구현해보려합니다.
소모성 아이템은 사용이 가능해야하고, 아이템 마다의 고유 효과를 발생시킵니다.
아래에서는 소모성 아이템 중 포션아이템을 만들어 테스트해보려합니다.
포션 아이템 데이터 생성하기 전
포션 아이템에 필요한 데이터는 다음과 같습니다.
- 공통적인 데이터
- id : 아이템의 고유 식별번호
- itemName : 아이템의 이름
- itemTooltip : 아이템 툴팁
- itemIcon : 아이템 아이콘 이름
- 포션 아이템만의 데이터
- value : 회복량
- 셀 수 있는 아이템 데이터 : 포션과 같은 아이템은 한 슬롯에 여러개를 소지할 수 있습니다.
- maxAmount : 한 슬롯의 최대 소지량
포션 아이템보다 선행되어야 하는것은 바로 “셀 수 있는 아이템” 즉 갯수가 있는 아이템입니다.
따라서 Item -> CountableItem -> PortionItem 과 같은 상속관계가 만들어집니다.
CountableItem, CountableItemData
CountableItem 클래스는 갯수가 있는 아이템에 대한 기능을 관리합니다.
- 아이템의 갯수 제한 설정
- 아이템 갯수가 남아있는지 여부 및 한 슬롯의 수량이 가득찼는지에 대한 여부
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
CountableItem : 셀 수 있는 아이템
SetAmount(int amount) :
- amount가 0~MaxAmount 이면 amount를 반환
- amount가 범위를 벗어나면 0 또는 MaxAmount를 반환
*/
public abstract class CountableItem : Item
{
public CountableItemData CountableData { get; private set; }
// 현재 아이템 수량
public int Amount { get; protected set; }
// 한 슬롯의 최대 수량
public int MaxAmount => CountableData.MaxAmount;
// 수량이 가득찼는지 여부
public bool IsMax => Amount >= CountableData.MaxAmount;
// 개수가 있는지 여부
public bool IsEmpty => Amount <= 0;
public CountableItem(CountableItemData data, int amount = 1) : base(data)
{
CountableData = data;
SetAmount(amount);
}
// 한 슬롯의 갯수 범위 제한
public void SetAmount(int amount)
{
Amount = Mathf.Clamp(amount, 0, MaxAmount);
}
}
CountableItemData 클래스는 갯수가 있는 아이템에 대한 정보(여기서는 최대수량)를 관리합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
CountableItemData : 갯수가 있는 아이템 데이터
*/
public abstract class CountableItemData : ItemData
{
[SerializeField] protected int maxAmount; // 최대 수량
public int MaxAmount => maxAmount;
}
포션 아이템 데이터
포션 아이템의 기능은 PortionItem 클래스가, 포션 아이템에 대한 데이터는 PortionItemData 클래스가 관리합니다.
포션 아이템은 사용이 가능해야하므로, IUsableItem 인터페이스를 상속받습니다.
IUsableItem 인터페이스
아이템을 “사용” 하는 메서드를 작성했습니다.
public interface IUsableItem
{
// 아이템 사용
bool Use();
}
PortionItem, PortionItemData
PortionItem 클래스는 포션 아이템에 대한 기능을 관리합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
PortionItem : 포션 아이템
Use() : IUsableItem 인터페이스 상속
- (임시) 갯수 하나 차감, 성공여부 반환
*/
public class PortionItem : CountableItem, IUsableItem
{
public PortionItem(PortionItemData data, int amount = 1) : base(data, amount) { }
public bool Use()
{
Amount--;
return true;
}
}
- 포션 아이템은 “사용가능”한 아이템으로, IUsableItem 인터페이스를 상속받아 메서드를 구현합니다.
- Use() 함수는 아이템을 사용하는 함수로, 임시로 갯수를 하나 차감하도록 했습니다.
PortionItemData 클래스는 포션아이템의 데이터를 관리합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
PortionItemData : 포션 아이템 데이터
생성자 : 데이터를 받아 초기화
CreateItem() : 초기화된 데이터로 아이템 객체 생성
*/
public class PortionItemData : CountableItemData
{
[SerializeField] private float value; // 회복량
public float Value => value;
public PortionItemData(PortionItemDTO dto)
{
this.id = dto.id;
this.itemName = dto.itemName;
this.itemToolTip = dto.itemToolTip;
this.itemIcon = dto.itemIcon;
this.maxAmount = dto.maxAmount;
this.value = dto.value;
}
public override Item CreateItem()
{
return new PortionItem(this);
}
}
포션 아이템 데이터 직렬화 클래스
PortionItemDTO 클래스는 포션아이템데이터를 저장 및 전송하기 위한 클래스입니다.
/*
PortionItemData 직렬화 전용 클래스
*/
[System.Serializable]
public class PortionItemDTO
{
public int id; // 아이템 id
public string itemName; // 아이템 이름
public string itemToolTip; // 아이템 툴팁
public string itemIcon; // 아이템 아이콘 이름
public int maxAmount; // 최대 소지량
public float value; // 회복량
}
포션아이템 JSON 파일 생성
마지막으로 포션아이템에대한 데이터를 저장할 JSON 파일을 작성했습니다.
{
"Portion": [
{
"id": 2001,
"itemName": "엘릭서",
"itemToolTip": "Hp를 일정량 회복시켜준다.",
"itemIcon": "Item_PortionItem_Elixer.png",
"maxAmount": 99,
"value": 30.0
},
{
"id": 2002,
"itemName": "마나 엘릭서",
"itemToolTip": "Mp를 일정량 회복시켜준다.",
"itemIcon": "Item_PortionItem_ManaElixer.png",
"maxAmount": 99,
"value": 30.0
}
]
}
- 포션 아이템 id는 2000번대 부터 시작되도록 했습니다.
- Portion 배열에 아이템 정보를 저장했습니다.
테스트
인벤토리에 아이템이 추가되는지만 확인하였습니다.
갯수는 현재 표시되지 않습니다.
댓글남기기