2 분 소요

Intro

이번 포스팅에서는 게임내에서 사용될 여러가지 아이템 중 무기아이템 클래스를 만들어보려합니다.

먼저, 제가 생각한 아이템 클래스의 구조도입니다.

image

ItemData 클래스는 아이템이 가지는 공통속성(id(식별자), itemName(아이템이름), itemTooltip(아이템 툴팁))을 가지고있습니다.

아이템에는 장착가능한 장비아이템과 소모가능한 소비아이템으로 구성할생각이며, 각 EquipmentItemData, CountableItemData로 만들생각입니다.

또한 장비아이템에는 방어구와 무기등으로 나뉠것이므로 최종적으로,

  • 무기아이템의 경우 EquipmentItemData를 상속받고
    • EquipmentItemData는 ItemData를 상속받습니다.
  • 방어구아이템의 경우 EquipmentItemData를 상속받고
    • EquipmentItemData는 ItemData를 상속받습니다.

이런식으로 만들어둔다면 나중에 어떤 아이템을 추가하더라도 쉽게 추가가능할것입니다.

  그리고, 이런 데이터들은 json 파일로 작성하여 로컬에 저장하고 DataManager를 통해 Load하여 게임내에서 사용할 수 있도록 할것입니다.

여기에서는 아이템중 무기아이템클래스를 먼저 만들어봤습니다.

ItemData 클래스

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

/*
                ItemData
                    - EquipmentItemData
                        - WeaponItemData
 */

public abstract class ItemData 
{
    [SerializeField] protected int id;                        // 아이템 id
    [SerializeField] protected string itemName;               // 아이템 이름
    [SerializeField] protected string itemToolTip;            // 아이템 툴팁

    public int ID => id;
    public string ItemName => itemName;
    public string ItemToolTip => itemToolTip;


    // 아이템 생성
    public abstract Item CreateItem();  
}
  • ItemData 클래스는 모든 아이템들의 부모클래스이며 공통된 속성인 id, itemName, itemToolTip이 있습니다.
  • 이 데이터들은 그저 읽기만 가능하고, 아래 자식클래스들이 접근가능하도록 protected로 접근제한을 뒀습니다.

Item 클래스

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

public abstract class Item
{
    public ItemData Data { get; private set; }

    public Item(ItemData data) => Data = data;
}
  • Item 클래스는 ItemData를 받아 세팅합니다.

EquipmentItemData

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

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

    [SerializeField] private int maxDurability;
    */
}
  • 장비아이템이 가지는 공통속성을 가집니다.
  • 지금은 아무것도 작성되어있지 않습니다. 나중에 내구도와 같은 기능을 추가하고싶다면 작성할 예정입니다.

EquipmentItem

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

public abstract class EquipmentItem : Item
{
    public EquipmentItemData EquipmentData { get; private set; }

    public EquipmentItem(EquipmentItemData data) : base(data)
    {
        EquipmentData = data;
    }
}
  • EquipmentItemData를 받아 세팅합니다.

WeaponItemData

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

public class WeaponItemData : EquipmentItemData
{
    public int Damage { get; private set; }             // 무기 데미지
    public float Rate { get; private set; }             // 공격속도

    public WeaponItemData(WeaponItemDTO dto)
    {
        this.id = dto.id;
        this.itemName = dto.itemName;
        this.itemToolTip = dto.itemToolTip;
        this.Damage = dto.damage;
        this.Rate = dto.rate;
    }

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

  • 무기아이템이 가지는 공통속성 데미지와 공격속도를 가지고있습니다.
  • Json 파일의 내용을 읽어와 데이터를 세팅합니다.

WeaponItem

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

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

WeaponItemDTO

  • WeaponItemDTO 클래스는 무기데이터를 직렬화하기위한 클래스로, 단순한 데이터구조입니다.
  • 이 클래스는 Json 데이터 전송만을 담당하며 로드 후 WeaponItemData 객체로 변환하여 사용됩니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/*
                WeaponItemData 직렬화 전용 클래스
 */

[System.Serializable]
public class WeaponItemDTO
{
    public int id;                      // 아이템 id
    public string itemName;             // 아이템 이름
    public string itemToolTip;          // 아이템 툴팁
    public int damage;                  // 무기 데미지
    public float rate;                  // 공격속도
}

이렇게 기본적인 아이템구조 세팅이 완료되었습니다. 사실 이런식으로 만들어야겠다는 생각만 했었는데, 실제로 구현하려고하니 굉장히 생각할것도 많고 뜻대로 되지않았던것같습니다. 이틀밤동안 이것만 잡고있었던것같습니다.

다음 포스팅에서는 실제 데이터를 가지고 이렇게 만들어둔 아이템클래스가 제대로 동작하는지 확인합니다.

댓글남기기