[2025_10_15]아이템 장착 및 포션사용

2025. 10. 15. 21:00TIL

1. 진행 내용

오늘은 아이템 장착과 포션 사용 등 인벤토리(아이템) 파트를 담당한 팀원과 많은 소통을 해야 했던 날이었다.

처음에는 Player 클래스에서 장착 관리 전체를 처리하려고 했으나, 팀원의 코드와 충돌이 발생하면서 버그가 생겼다.
이에 따라 구조를 수정하여, Player에서는 장착 여부(bool) 를 직접 변경하지 않고, 이미 장착된 아이템 정보를 받아 스탯에 반영하는 방식으로 코드를 수정하였다.

 

 #region 아이템 장착 관리
 public void ToggleEquipItem(Item item)
 {
     if (item is Weapon weapon)
     {
         ToggleEquipWeapon(weapon);
     }
     else if(item is Armor armor)
     {
         ToogleEquipArmor(armor);
     }
 }

 private void ToggleEquipWeapon(Weapon  weapon)
 {
     if(weapon.isEquipped)
     {
         if(equippedWeapon!=null&&equippedWeapon!=weapon)
         {
             equippedWeapon.isEquipped = false;
         }

         equippedWeapon = weapon;
         UpdateStats();
     }
     else
     {
         equippedWeapon = null;
         UpdateStats();
     }
 }

 private void ToogleEquipArmor(Armor armor)
 {
     if (armor.isEquipped)
     {
         if (equippedArmor != null && equippedArmor != armor)
         {
             equippedWeapon.isEquipped = false;
         }

         equippedArmor = armor;
         UpdateStats();
     }
     else
     {
         equippedArmor = null;
         UpdateStats();
     }
 }

 #endregion

 


2. 포션 로직 수정

처음에는 포션 관련 기능을 Potion 스크립트와 Player 스크립트로 나누어,
Potion 쪽에서 포션의 동작 로직(예: 최대 HP일 때 작동 안 함, 개수가 0이면 리스트에서 삭제 등)을 담당하도록 설계했다.
하지만 이 방식은 다른 팀원이 사용하기 불편하다는 문제점이 있었다.

이에 구조를 변경하여 인벤토리에서 포션 클릭 시 바로 사용되도록 수정하였다.

 
GameManager.Instance.player.UsePotion(Potion potion);

이제 포션의 선택(사용) 여부는 Potion 스크립트가 담당하고,
실제 작동 로직은 Player 스크립트가 처리하는 구조로 정리되었다.

    #region 소비 아이템 사용
    public void UsePotion(Potion potion)
    {
        if (!IsUsePotion(potion)) // 체크
        {
            return;
        }

        Heal_Potion(potion); // 회복

        potion.count--;
        if (potion.count <= 0)
        {
            inventory.Remove(potion); // 제거
        }
    }

    private bool IsUsePotion(Potion potion)
    {
        switch (potion.potiontype)
        {
            case PotionType.HP:
                if (hp >= maxHp)
                {
                    Console.WriteLine("HP최대");
                    return false;
                }
                break;
            case PotionType.MP:
                if (mp >= maxMp)
                {
                    Console.WriteLine("MP최대");
                    return false;
                }
                break;
            case PotionType.Stamina:
                if (stamina >= maxStamina)
                {
                    Console.WriteLine("스태미나최대");
                    return false;
                }
                break;
        }
        return true;
    }

    private void Heal_Potion(Potion potion)
    {
        switch (potion.potiontype)
        {
            case PotionType.HP:
                hp = Math.Min(hp + potion.healAmount, maxHp);
                break;

            case PotionType.MP:
                mp = Math.Min(mp + potion.healAmount, maxMp);
                break;

            case PotionType.Stamina:
                stamina = (int)Math.Min(stamina + potion.healAmount, maxStamina);
                break;
        }
    }
    #endregion
}

3. 결과 및 느낀 점

  • 인벤토리와 Player 간의 역할이 명확히 분리되어 코드 충돌이 해소되었다.
  • 포션 시스템의 사용 흐름이 단순해져 다른 팀원도 쉽게 사용할 수 있게 되었다.
  • 협업 시에는 각 클래스의 책임을 명확히 구분하는 것이 중요하다는 점을 다시 한 번 느꼈다.
  • out 키워드에 대해 좀 더 공부해 보고 싶어졋다. 중간에 out을 사용해서 구현 하려 했는데 굳이 필요한가? 라는 생각이 들어 사용하지 않았다. 어떤 때 사용하면 어떤 이득이 있고 올바른 상황에서  사용하려면 어떻게 해야하는지 좀 더 생각해 보게 되었다.