LambFerret's Blog

건파밍 #2 게임 시스템 (2) : Data Persistence 본문

게임 개발/#2 건파밍 (2D 탑뷰슈터)

건파밍 #2 게임 시스템 (2) : Data Persistence

램페럿 2025. 1. 18. 18:50

이제 정말 중요하다고 생각하는! 저장 불러오기 그리고 이를 활용한 씬이동을 보도록 하겠다.

 

들어가기 앞서 출처 ( https://www.youtube.com/watch?v=aUi9aijvpgs )에서 99%는 차용했다. 꼭 보시길.

이코드는 이전 프로젝트때도 아주 유용하게 썼기에 이전과 동일하게 가져와서 사용하고있다. 

   

 

디렉토리 구조

 

주로 사용하는 부분은 IDataPersistence, GameData 이기에 이외의 DataPersistenceManager.cs FileDataHandler.cs 는 아주 간략하게 소개하자면

 

DataPersistenceManager : Save와 Load를 담당한다. IDataPersistence 인터페이스를 가진 물체의 저장 및 불러오기에 대한 로직이 있다. 

FileDataHandler : 직렬화된 GameData Stream을 파일로 저장한다.

 

즉 IDataPersistence와 GameData 를 사용한다 

 

using Systems.persistence.data;

namespace Systems.persistence
{
    public interface IDataPersistence
    {
        void LoadData(GameData data);
        void SaveData(GameData data);
    }
    
    [Serializable]
    public class GameData
    {
		public int maxHealth;
		public int currentHealth;
        
        public GameData() 
        {
        	maxHealth = 100;
        }
    }
}


간단하게  Player의 체력에 관해 예시를 들겠다. 

 

GameData의 생성자에는 데이터의 초기값을 넣어준다. 이렇게 하면 New Game을 눌렀을때 자동으로 player는 최대체력 100을 가지게 된다. 

 

그럼 이제 IDataPersistence를 가진 Player에서 LoadData, SaveData를 보자면 

 

public class Player : Character, IDataPersistence
{
	#region Save & Load

        public void LoadData(GameData data)
        {
            maxHealth = data.maxHealth;
            CurrentHealth = data.currentHealth;
            WorldHUD.Instance.UpdatePlayerHealth(this);
        }

        public void SaveData(GameData data)
        {
            data.maxHealth = maxHealth;
            data.currentHealth = CurrentHealth;
        }

        #endregion
}

 

(Character는 MonoBehaviour를 상속받았다)

 

currentHealth는 플레이어의 현재체력을 나타내는데, SaveData로 currentHealth가 File에 저장된다. 이는 DataPersistenceManager의 OnSceneUnloaded 에서 실행되기에 씬A 에서 B로 이동할때 씬A의 씬이 unload될때 호출된다.

 

반대로 씬B가 load될때는 LoadData가 호출되어 플레이어 현재체력에 저장된 FIle의 currentHealth를 가져와서 할당한다. 

 

즉 간단하게 말하자면 이 현재 게임은 씬이 이동될때 마다 저장된다. 이를 피하려면 다른 오버로딩 메소드를 써볼것을 고려할 수 있으나 딱히 필요도없고 자동저장 효과를 낼 수 있어서 나는 구현하지 않았다. 

 

주의할 점으로는 씬의 Awake, Start 와 LoadData의 순서인데 간단한 순서를 보자면 

  1. Scene A 에서 SceneManager.LoadScene("B") 를 사용하여 Scene B 로 이동. 
  2. Scene A 의 모든 SaveData 호출. -> DataPersistenceManager
  3. SaveData에 사용된 GameData를 파일로 저장. -> FileDataHandler
  4. ----- Scene B 로딩 시작 ------
  5. Scene B의 Awake() 호출 
  6. FileDataHandler가 저장파일을 로드 
  7. Scene B 의 모든 LoadData를 호출 -> DataPersistenceManager
  8. Scene B 의 Start() 호출

 

즉 Awake와 Start 사이 지점이므로 만약 그 씬이 저장된 데이터의 currentHealth를 사용한다면 Start에서 사용하는것이 좋을 것 이다. 

 

코딩을 정말 흥븍흐그믄들으 주었다

 

나머지는 필요없이 빈 GameObject에 DataPersistenceManager 컴포넌트만 넣어주면 알아서 세이브로드를 도맡아준다. 

컨트롤하기는 어렵지만 심성은 착한 친구니까 친해지는게 좋다. 

 

Comments