오늘은 저장 기능을 구현했다.
구현 기능
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 |