[2025_10_15]아이템 장착 및 포션사용
2025. 10. 15. 21:00ㆍTIL
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을 사용해서 구현 하려 했는데 굳이 필요한가? 라는 생각이 들어 사용하지 않았다. 어떤 때 사용하면 어떤 이득이 있고 올바른 상황에서 사용하려면 어떻게 해야하는지 좀 더 생각해 보게 되었다.
'TIL' 카테고리의 다른 글
| [2025_10_17]Dirty Flag패턴과 지연평가(Lazy Evaluation) (0) | 2025.10.17 |
|---|---|
| [2025_10_16]Json-2 (0) | 2025.10.16 |
| [2025_10_14]새로운 팀원과 TextRpg팀프로젝트 시작 (0) | 2025.10.14 |
| [2025_10_13]TextRpg 개발 회고 (0) | 2025.10.13 |
| [2025_10_02]Json-1 (0) | 2025.10.02 |