Unity_2기 내일배움캠프 TIL

Unity_2기 14주차 (230207)

잼잼재미 2024. 2. 7. 15:22

오늘은 저장 기능을 구현했다.

 

 

구현 기능


1. 저장 기능

 

게임 플레이 중, 저장 버튼을 누르고 StartScene에서 불러오기 버튼을 누르면 Data를 불러오도록 구현했다.

 

 

public void DataSave()
{
    PlayerPrefs.SetInt("IsData", 1);
    PlayerPrefs.SetFloat("SaveHp", _playerConditions.Health.CurValue);
    PlayerPrefs.SetInt("SaveReviveCount", _playerController.ReviveCount);
    PlayerPrefs.SetInt("SaveWood", _resourceCollector.Resources);
    PlayerPrefs.SetInt("SaveCurrentBullet", _playerController.GunController.CurrentGun.CurrentBulletCount);
    PlayerPrefs.SetInt("SaveCarryBullet", _playerController.GunController.CurrentGun.CarryBulletCount);
    PlayerPrefs.SetInt("SaveCoin", _playerController.CurrentCoin);
    PlayerPrefs.SetInt("SavePartnerSpawnCount", _playerController.PartnerSpawnCount);
    PlayerPrefs.SetInt("SaveCannonBall", _playerController.CannonBall);

    PlayerPrefs.SetFloat("PlayerPositionX", GameManager.I.PlayerManager.Player.transform.position.x);
    PlayerPrefs.SetFloat("PlayerPositionY", GameManager.I.PlayerManager.Player.transform.position.y);
    PlayerPrefs.SetFloat("PlayerPositionZ", GameManager.I.PlayerManager.Player.transform.position.z);
    PlayerPrefs.SetFloat("PlayerRotationX", GameManager.I.PlayerManager.Player.transform.rotation.eulerAngles.x);
    PlayerPrefs.SetFloat("PlayerRotationY", GameManager.I.PlayerManager.Player.transform.rotation.eulerAngles.y);
    PlayerPrefs.SetFloat("PlayerRotationZ", GameManager.I.PlayerManager.Player.transform.rotation.eulerAngles.z);
    PlayerPrefs.SetString("CurrentScene", GameManager.I.SceneManager.CurrentSceneName);
}

public void DataLoad()
{
    _playerConditions.Health.CurValue = PlayerPrefs.GetFloat("SaveHp");
    _playerController.ReviveCount = PlayerPrefs.GetInt("SaveReviveCount");
    _resourceCollector.Resources = PlayerPrefs.GetInt("SaveWood");
    _playerController.GunController.CurrentGun.CurrentBulletCount = PlayerPrefs.GetInt("SaveCurrentBullet");
    _playerController.GunController.CurrentGun.CarryBulletCount = PlayerPrefs.GetInt("SaveCarryBullet");
    _playerController.CurrentCoin = PlayerPrefs.GetInt("SaveCoin");
    _playerController.PartnerSpawnCount = PlayerPrefs.GetInt("SavePartnerSpawnCount");
    _playerController.CannonBall = PlayerPrefs.GetInt("SaveCannonBall");

    _playerController.ReviveConutText.text = _playerController.ReviveCount.ToString();
    _resourceCollector.UpdateResourceText();
    _playerController.CurrentCoinText.text = _playerController.CurrentCoin.ToString();
    _playerController.PartnerSpawnCountText.text = _playerController.PartnerSpawnCount.ToString();
    _playerController.CannonBallText.text = _playerController.CannonBall.ToString();


    GameManager.I.PlayerManager.PlayerSetPosition(new Vector3(PlayerPrefs.GetFloat("PlayerPositionX"), PlayerPrefs.GetFloat("PlayerPositionY"),
        PlayerPrefs.GetFloat("PlayerPositionZ")));
    GameManager.I.PlayerManager.PlayerSetRotation(new Vector3(PlayerPrefs.GetFloat("PlayerRotationX"), PlayerPrefs.GetFloat("PlayerRotationY"),
        PlayerPrefs.GetFloat("PlayerRotationZ")));

}

 

기존의 씬을 전환할 때는 Player의 기본적인 스탯만 PlayerPrefs로 저장하였는데, 게임 플레이를 저장하기 위해서는 그 외에도 Player position, rotation 또한 저장해야해서 DataManager에 함수를 추가했다.

 

 

if (PlayerPrefs.GetInt("DataLoad") == 1)
{
    if (CurrentSceneName == "1")
    {
        StartCoroutine(CODataLoad());
        GameObject.Find("CameraChanger").SetActive(false);
        GameObject.Find("Trailer Camera (1)").SetActive(false);
        GameObject.Find("press a to start").SetActive(false);
        GameManager.I.PlayerManager.Player.SetActive(true);
    }
    else if (CurrentSceneName == "2")
    {
        StartCoroutine(CODataLoad());
        GameObject.Find("Tutorial").SetActive(false);
    }
    else
    {
        StartCoroutine(CODataLoad());
    }

    PlayerPrefs.SetInt("DataLoad", 0);
}
else StartCoroutine(COPlayerDataLoad());

 

기존에 씬을 시작할 때마다, 전 씬에서 저장된 데이터를 불러오도록 구현했기 때문에 중복으로 실행되지 않도록 다음과 같이 SceneManager에 코드를 수정했다. 그리고 1번, 2번 씬의 경우에는 시작 시, 튜토리얼이 실행되지 않도록 하였다.

 

 

 

public void DeleteData()
{
    PlayerPrefs.DeleteAll();
}

 

PlayerPrefs를 전부 삭제할 수 있는 데이터 삭제 기능도 만들었다. 

 

 

회고


데이터 저장은 PlayerPrefs 외에 Jason 등 여러가지 방법이 있고 그 중, PlayerPrefs가 가장 간단한 방법이라고 알고있다. 데이터 저장 구현을 처음했기 때문에 PlayerPrefs로 구현했다. 다음번에 데이터 저장에 대해서 더 공부를하고 다른 방법으로도 시도해보겠다.

'Unity_2기 내일배움캠프 TIL' 카테고리의 다른 글

Unity_2기 15주차 (230213)  (0) 2024.02.13
Unity_2기 14주차 (230208)  (0) 2024.02.08
Unity_2기 14주차 (230206)  (0) 2024.02.06
Unity_2기 14주차 (230205)  (0) 2024.02.05
Unity_2기 13주차 (230202)  (0) 2024.02.02