상세 컨텐츠

본문 제목

유니티 인벤토리 아이템 설정

유니티/기능

by MJ_119 2024. 11. 8. 11:32

본문

- 인벤토리 게임 아이템 설정.

스크립터블 오브젝트

Item.cs

 

using UnityEngine;

public enum ItemType
{
    Equipment,    // 장비형
    Consumable,   // 소비형
    Material,     // 재료
    Quest,        // 퀘스트
    Misc         // 기타
}

[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item")]
public class Item : ScriptableObject
{
    [Header("기본 정보")]
    public string itemName;            // 아이템 이름
    public Sprite itemIcon;            // 아이템 아이콘
    [TextArea(3, 5)]
    public string itemDescription;     // 아이템 설명
    public ItemType itemType;          // 아이템 타입
    public string itemID;              // 고유 ID
    public bool isStackable;           // 중첩 가능 여부
    public int maxStackSize = 1;       // 최대 중첩 개수

    [Header("아이템 효과")]
    public float useTime = 1f;         // 사용 시간
    public bool canUseInBattle = true; // 전투중 사용 가능 여부
    
    [Header("장비 속성")]
    public bool isEquipment;           // 장비 여부
    public EquipmentSlotType equipSlot; // 장착 슬롯 종류
    public int durability = 100;       // 내구도
    public int defense;                // 방어력
    public int attack;                 // 공격력
    
    [Header("소비 아이템 속성")]
    public bool isConsumable;          // 소비 아이템 여부
    public float healthRestore;        // HP 회복량
    public float manaRestore;          // MP 회복량
    public float duration;             // 효과 지속시간
    
    [Header("기타")]
    public int buyPrice;               // 구매 가격
    public int sellPrice;              // 판매 가격
    public string requiredLevel;       // 필요 레벨
    public Rarity rarity;             // 희귀도

    // 아이템 사용 메서드
    public virtual void Use(PlayerCharacter player)
    {
        if (isConsumable)
        {
            // 소비 아이템 사용 로직
            player.RestoreHealth(healthRestore);
            player.RestoreMana(manaRestore);
        }
    }

    // 장비 장착 메서드
    public virtual void Equip(PlayerCharacter player)
    {
        if (isEquipment)
        {
            // 장비 장착 로직
            player.AddDefense(defense);
            player.AddAttack(attack);
        }
    }

    // 장비 해제 메서드
    public virtual void Unequip(PlayerCharacter player)
    {
        if (isEquipment)
        {
            // 장비 해제 로직
            player.RemoveDefense(defense);
            player.RemoveAttack(attack);
        }
    }
}

// 장비 슬롯 타입
public enum EquipmentSlotType
{
    None,
    Head,
    Chest,
    Legs,
    Feet,
    Weapon,
    Shield,
    Accessory
}

// 아이템 희귀도
public enum Rarity
{
    Common,
    Uncommon,
    Rare,
    Epic,
    Legendary
}

 

추가 고려사항:

  1. 아이템 사용 상태 관리:
    • 아이템의 사용 여부는 인벤토리나 플레이어 상태에서 관리하는 것이 좋습니다.
    • ScriptableObject는 데이터 에셋이므로, 런타임 상태는 별도로 관리해야 합니다.
  2. 쿨다운 시스템  : 아이템이나 스킬을 사용한 후 일정 시간이 지나야 다시 사용할 수 있게 하는 시스템입니다. 예를 들어:
  3.  
[CreateAssetMenu(fileName = "NewItem", menuName = "Inventory/Item")]
public class Item : ScriptableObject
{
    [Header("쿨다운 관련")]
    public float cooldownTime = 0f;    // 쿨다운 시간 (초)
    
    // 아이템을 사용할 수 있는지 체크하는 메서드
    public bool CanUse(ItemInstance itemInstance)
    {
        return itemInstance.remainingCooldown <= 0f;
    }
}

// 실제 인벤토리에서 사용되는 아이템 인스턴스 클래스
public class ItemInstance
{
    public Item itemData;              // 아이템의 기본 정보
    public float remainingCooldown;    // 남은 쿨다운 시간
    
    public void UpdateCooldown()
    {
        if (remainingCooldown > 0)
        {
            remainingCooldown -= Time.deltaTime;
        }
    }

    public void Use(PlayerCharacter player)
    {
        if (CanUse())
        {
            // 아이템 사용 로직
            itemData.Use(player);
            
            // 쿨다운 시작
            remainingCooldown = itemData.cooldownTime;
        }
    }

    private bool CanUse()
    {
        return remainingCooldown <= 0f;
    }
}

 

// 체력 포션 생성 예시
var healthPotion = CreateInstance<Item>();
healthPotion.itemName = "체력 포션";
healthPotion.cooldownTime = 5f;  // 5초 쿨다운

// 게임 매니저나 인벤토리 매니저에서의 업데이트
void Update()
{
    // 모든 아이템 인스턴스의 쿨다운 업데이트
    foreach(var item in inventory.items)
    {
        item.UpdateCooldown();
    }
}

 

이렇게 구현하면:

  1. 체력 포션을 사용하면 5초 동안 다시 사용할 수 없음
  2. UI에서 남은 쿨다운 시간을 표시할 수 있음
  3. 아이템마다 다른 쿨다운 시간 설정 가능

대표적인 예시:

  • 체력 포션: 30초 쿨다운
  • 마나 포션: 60초 쿨다운
  • 버프 아이템: 180초 쿨다운

이런 식으로 아이템의 밸런스를 조절할 수 있습니다.

 

 

 

 

 

 

관련글 더보기