🛠️ 문제 상황

게임에서 인벤토리 데이터를 관리하는 과정에서, 플레이어가 사망하여 "다시하기"를 눌렀을 때 인벤토리가 원래 상태로 복원되지 않는 문제가 발생

🔍 원인 분석

InventoryManagerGameManager가 각각 InventoryData를 가지고 있도록 구현했다.

그러나 "다시하기"를 눌러도 데이터가 복원되지 않고, 현재 변경된 데이터가 그대로 유지되는 문제가 발생.

문제를 확인하기 위해 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는 원래 값으로 복원되어야 함

실제 결과: currentInventoryGameManager.GameInventory의 값이 같음 (즉, 복원되지 않음)

GameManager.GameInventory를 InventoryManager.currentInventory로 덮어 쓴 적이 없으므로, GameManager.GameInventory는 변동 이전의 데이터(스테이지 시작 전의 상태 데이터)를 유지해야 한다. 그러나 동일한 값이 출력되는 것으로 보아, InventoryManager.currentInventory를 수정하면 GameManager.GameInventory도 같이 변경되는 문제가 발생하고 있다.


🤔 문제의 핵심: C#의 객체는 '참조 타입'

C#에서 = 연산자를 사용하여 객체를 대입하면, 새로운 객체를 생성하는 것이 아니라 참조(Reference)만 복사된다.

즉,

currentInventory = Managers.Game.GameInventory;