게임에서 인벤토리 데이터를 관리하는 과정에서, 플레이어가 사망하여 "다시하기"를 눌렀을 때 인벤토리가 원래 상태로 복원되지 않는 문제가 발생
InventoryManager와 GameManager가 각각 InventoryData를 가지고 있도록 구현했다.
InventoryManager는 스테이지 진행 중의 변동 데이터를 저장.GameManager는 스테이지 시작 전의 상태 데이터를 보관하고, 스테이지 실패 시 이를 복원.그러나 "다시하기"를 눌러도 데이터가 복원되지 않고, 현재 변경된 데이터가 그대로 유지되는 문제가 발생.
문제를 확인하기 위해 Debug.Log()를 추가해 확인한 결과, InventoryManager.RestoreInventoryState() 메서드에서 GameManager.GameInventory를 가져올 때, 두 객체의 데이터가 동일한 값을 출력하는 것을 발견했다.
csharp
복사편집
public void RestoreInventoryState()
{
Debug.Log("InventoryManager : Inventory 상태를 복구합니다. 이전 데이터를 가져와 덮어씁니다.");
currentInventory = Managers.Game.GameInventory; // 원래대로 복구
Debug.Log($"{currentInventory.items[Define.Item.hpPotionSmall]}, {Managers.Game.GameInventory.items[Define.Item.hpPotionSmall]}");
}
✔ 기대했던 결과: currentInventory는 원래 값으로 복원되어야 함
✖ 실제 결과: currentInventory와 GameManager.GameInventory의 값이 같음 (즉, 복원되지 않음)
GameManager.GameInventory를 InventoryManager.currentInventory로 덮어 쓴 적이 없으므로, GameManager.GameInventory는 변동 이전의 데이터(스테이지 시작 전의 상태 데이터)를 유지해야 한다. 그러나 동일한 값이 출력되는 것으로 보아, InventoryManager.currentInventory를 수정하면 GameManager.GameInventory도 같이 변경되는 문제가 발생하고 있다.
C#에서 = 연산자를 사용하여 객체를 대입하면, 새로운 객체를 생성하는 것이 아니라 참조(Reference)만 복사된다.
즉,
currentInventory = Managers.Game.GameInventory;