Status에서 보면 여전히 장착은 하고 있다
다만, 장착관리에서 보면 미장착 표시가 나오는 문제다
혹시 불러오면 equipList에 저장된 순서가 바뀌는 것이 아닐까 생각했다
그래서 저장했던 당시의 정보를 json파일에서 확인했다
{"$type":"SpartaDungeon.Managers.GameData, SpartaDungeon","fileIndex":3,"player":{"$type":"SpartaDungeon.Player, SpartaDungeon","data":{"$type":"SpartaDungeon.PlayerData, SpartaDungeon","name":"asdf","classType":1,"level":1,"attack":10.0,"defence":5.0,"maxHp":100.0,"hp":100.0,"maxMp":100.0,"mp":0.0,"exp":0,"gold":1000},"armor":null,"weapon":{"$type":"SpartaDungeon.Weapon, SpartaDungeon","name":"빛바랜 검","itemType":1,"classType":1,"attack":30.0,"defence":0.0,"hp":0.0,"mp":0.0,"description":"색이 빠진 낡은 검, 겨우 휘두룰수 있는 정도다","price":100,"IsEquipable":false}},"ownedList":{"$type":"System.Collections.Generic.List`1[[System.Object, System.Private.CoreLib]], System.Private.CoreLib","$values":[{"$type":"SpartaDungeon.Armor, SpartaDungeon","name":"낡은 갑옷","itemType":2,"classType":1,"attack":0.0,"defence":50.0,"hp":0.0,"mp":0.0,"description":"낡았지만 아직은 쓸만하다","price":150,"IsEquipable":false},{"$type":"SpartaDungeon.Weapon, SpartaDungeon","name":"빛바랜 검","itemType":1,"classType":1,"attack":30.0,"defence":0.0,"hp":0.0,"mp":0.0,"description":"색이 빠진 낡은 검, 겨우 휘두룰수 있는 정도다","price":100,"IsEquipable":false},{"$type":"SpartaDungeon.Armor, SpartaDungeon","name":"희미한 마력의 로브","itemType":2,"classType":2,"attack":0.0,"defence":40.0,"hp":0.0,"mp":0.0,"description":"가죽 덩어리 같지만, 희미한 마력이 느껴진다","price":150,"IsEquipable":false},{"$type":"SpartaDungeon.Weapon, SpartaDungeon","name":"편백나무 막대기","itemType":1,"classType":2,"attack":70.0,"defence":0.0,"hp":0.0,"mp":0.0,"description":"피톤치드가 나오는 그럭저럭한 막대기","price":100,"IsEquipable":false},{"$type":"SpartaDungeon.Weapon, SpartaDungeon","name":"빛바랜 검","itemType":1,"classType":1,"attack":30.0,"defence":0.0,"hp":0.0,"mp":0.0,"description":"색이 빠진 낡은 검, 겨우 휘두룰수 있는 정도다","price":100,"IsEquipable":false}]},"armedList":{"$type":"System.Collections.Generic.List`1[[System.Object, System.Private.CoreLib]], System.Private.CoreLib","$values":[{"$type":"SpartaDungeon.Weapon, SpartaDungeon","name":"빛바랜 검","itemType":1,"classType":1,"attack":30.0,"defence":0.0,"hp":0.0,"mp":0.0,"description":"색이 빠진 낡은 검, 겨우 휘두룰수 있는 정도다","price":100,"IsEquipable":false},{"$type":"SpartaDungeon.Weapon, SpartaDungeon","name":"빛바랜 검","itemType":1,"classType":1,"attack":30.0,"defence":0.0,"hp":0.0,"mp":0.0,"description":"색이 빠진 낡은 검, 겨우 휘두룰수 있는 정도다","price":100,"IsEquipable":false}]}}
중요한 것은 ownedList에 저장된 순서다
{"$type":"SpartaDungeon.Armor, SpartaDungeon","name":"낡은 갑옷","itemType":2,"classType":1,"attack":0.0,"defence":50.0,"hp":0.0,"mp":0.0,"description":"낡았지만 아직은 쓸만하다","price":150,"IsEquipable":false},
{"$type":"SpartaDungeon.Weapon, SpartaDungeon","name":"빛바랜 검","itemType":1,"classType":1,"attack":30.0,"defence":0.0,"hp":0.0,"mp":0.0,"description":"색이 빠진 낡은 검, 겨우 휘두룰수 있는 정도다","price":100,"IsEquipable":false},
{"$type":"SpartaDungeon.Armor, SpartaDungeon","name":"희미한 마력의 로브","itemType":2,"classType":2,"attack":0.0,"defence":40.0,"hp":0.0,"mp":0.0,"description":"가죽 덩어리 같지만, 희미한 마력이 느껴진다","price":150,"IsEquipable":false},
{"$type":"SpartaDungeon.Weapon, SpartaDungeon","name":"편백나무 막대기","itemType":1,"classType":2,"attack":70.0,"defence":0.0,"hp":0.0,"mp":0.0,"description":"피톤치드가 나오는 그럭저럭한 막대기","price":100,"IsEquipable":false},
{"$type":"SpartaDungeon.Weapon, SpartaDungeon","name":"빛바랜 검","itemType":1,"classType":1,"attack":30.0,"defence":0.0,"hp":0.0,"mp":0.0,"description":"색이 빠진 낡은 검, 겨우 휘두룰수 있는 정도다","price":100,"IsEquipable":false}]},
같은 아이템이 2번 들어가있는건.. 아마 예전에 2번 샀기 때문이겠지
이건 조금있다가 해결하자
낡은갑옷, 빛바랜검, 희미한 마력의 로브, 편백나무 막대기, 빛바랜검(이건 지워야한다)
이 순서로 ownedList에 저장됐다
순서가 왜 중요했냐면
// 인벤토리, 장착관리의 아이템
public void PrintInventory()
{
Console.Clear();
Console.WriteLine($"[{SceneManager.Instance.GetCurrentScene().GetName()}]\n보유 중인 아이템을 관리할 수 있습니다.\n");
Console.WriteLine("[아이템 목록]\n");
for (int i = 0; i < ItemManager.Instance.ownedList.Count; i++)
{
// 장착관리씬 한정해서 장착한 아이템은 [E] 출력
if (SceneManager.Instance.GetCurrentScene().GetName() == "equip"
&& IsEquiped(ItemManager.Instance.ownedList[i]))
{
// 글씨 색 바꾸어보자
Console.ForegroundColor = ConsoleColor.Green;
// 배경색 바꾸기: Console.BackgroundColor
Console.Write($"[E]");
}
...
ItemManager.Instance.ownedList[i] 를 통해 인덱스 접근을 하고 있기 때문이다
하지만, 인덱스는 똑같다
이전과 달라지지 않았다
// 해당 아이템을 장착하고 있는지 여부
public bool IsEquiped(Equipment item)
{
// 해당 아이템을 플레이어가 장착하고있다면
if (ItemManager.Instance.armedList.Contains(item))
{
return true;
}
return false;
}
false를 리턴한다
분명히 가지고 있는 아이템인데 false를 리턴하는게 이상했다
알아보니
JSON 직렬화 및 역직렬화 과정에서 객체의 참조가 유지되지 않기 때문에, 역직렬화된 객체는 원본 개겣와 동일함 참조를 가지지 않아서 항상 false가 리턴된다
비교 방식을 바꿔야한다
이름으로 비교하게 바꾸었다
그렇다면...
IsEquiped와 IsOwned 메서드 모두 이름을 비교하는 방식으로 바꾸어야겠다
// 해당 아이템을 장착하고 있는지 여부
public bool IsEquiped(Equipment item)
{
return ItemManager.Instance.armedList.Any(armedItem => armedItem.name == item.name);
//// 해당 아이템을 플레이어가 장착하고있다면
//if (ItemManager.Instance.armedList.Contains(item))
//{
// return true;
//}
//return false;
}
public bool IsOwned(Equipment item)
{
return ItemManager.Instance.ownedList.Any(ownedItem => ownedItem.name == item.name);
//// 플레이어의 아이템 리스트에 item이 있는지 확인한다
//if (ItemManager.Instance.ownedList.Contains(item))
//{
// return true;
//}
//return false;
}
그다음 다시 확인해보니
정상적으로 출력된다!
이름비교가 정답이었다
'유니티 부트캠프 8기 > Ch03. Mini Project2(250206 - 250213)' 카테고리의 다른 글
250217. 결합도, 응집도의 관점에서 본 아이템 클래스의 설계 (feat GW님) (0) | 2025.02.17 |
---|---|
Skill 구현하기 (0) | 2025.02.14 |
Quest 구현하기 (0) | 2025.02.13 |
전체적인 게임 아키텍처 설계 (0) | 2025.02.07 |