2 분 소요

Intro

  • 지난 포스팅에서 아이템 클래스와 아이템 데이터의 클래스를 작성했습니다.
  • 이번 포스팅에서는 개별 아이템의 데이터를 관리할 클래스들을 구현합니다.
  • 이렇게 Item클래스와 ItemData클래스를 따로 작성하는것은, 공통 데이터도 아이템 객체가 필드로 갖게 되어버리면 그만큼의 메모리의 낭비가 되므로 분리하는것이다.

CountableItem 클래스

  • CountableItem 클래스는 소모성 아이템이 가질 개별적인 데이터관리 및 동작을 구현합니다.
  1. 아이템 슬롯 한칸에 들어갈 갯수 범위설정
  2. 아이템을 합칠 때 갯수 추가 및 초과량 반환
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

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);         // .. 아이템 갯수는 0 ~ 99
    }

    // .. 갯수 추가 및 초과량 반환(초과량이 없을 시 0)
    public int AddAmountAndGetExcess(int amount)
    {
        int nextAmount = Amount + amount;
        SetAmount(nextAmount);

        return (nextAmount > MaxAmount) ? (nextAmount - MaxAmount) : 0;     // .. 초과하면 초과량을 반환.
    }

    protected abstract CountableItem Clone(int amount);
}

아이템 소비를 위한 인터페이스

  • 소모성 아이템은 사용이 가능해야합니다.
  • 아이템을 사용할 때 갯수가 하나 감소되도록하는 메소드가 있습니다.
public interface IUsableItem
{
     // .. 아이템 사용(사용여부 리턴)
     bool Use();
}

PortionItem 클래스

  • PortionItem 클래스는 포션아이템의 동작을 구현합니다.
  • IUsableItem 인터페이스를 상속하여 Use 메소드를 구현해줍니다.
public class PortionItem : CountableItem, IUsableItem
{
    // .. 수량이 있는, 사용가능한 아이템 - 포션
    public PortionItem(PortionItemData data, int amount = 1) : base(data, amount) { }

    // .. 사용
    public bool Use()
    {
        // .. 개수 하나 감소
        Amount--;

        return true;
    }

    protected override CountableItem Clone(int amount)
    {
        return new PortionItem(CountableData as PortionItemData, amount);
    }
}

  • 소모성아이템 - 포션아이템의 구현이 완료되었습니다.

EquipmentItem 클래스

  • EquipmentItem 클래스는 장비 아이템의 개별적인 데이터관리 및 동작을 구현합니다.
  • 아직 따로 동작은 없으며 프로퍼티를 사용하여 내구도의 세팅을 했습니다.
public abstract class EquipmentItem : Item
{
    public EquipmentItemData EquipmentData { get; private set; }

    public int Durability
    {
        get => durability;
        // .. 내구도
        set
        {
            if (value < 0) value = 0;
            if (value > EquipmentData.MaxDurability)
                value = EquipmentData.MaxDurability;
            durability = value;
        }
    }

    private int durability;

    // .. 초기화
    public EquipmentItem(EquipmentItemData data) : base(data)
    {
        EquipmentData = data;
        Durability = data.MaxDurability;
    }
}

WeaponItem 클래스

public class WeaponItem : EquipmentItem
{
    public WeaponItem(WeaponItemData data) : base(data) { }
}

  • 이렇게 해서 아이템 데이터와 그 아이템의 동작을 구현하였습니다.

댓글남기기