-
(37) 저장 / 불러오기 구현Galaxy Ball/2. 싱글플레이 - 스토리모드 2024. 7. 28. 00:45
이제 드디어 시작화면과 인게임을 연결하는 작업을 해보도록 하겠다
사실 잠깐이지만 저장/불러오기 기능을 살짝 구현해본게 있다
바로 챌린지 모드를 만들때 좌측 상단에 있는 신기록 스코어를 저장할때 저장 기능을 사용하긴 했었다
이번엔 단순히 스코어 저장을 넘어 스토리모드 진행상황을 저장하여 "이어하기"를 누르면
진행중인곳부터 진행하도록 해보겠다
우선 시작화면에서 스토리 모드에 진입하기까지는 3가지 단계가 있다
정확히 말하면 3번째 사진에 보이는 창은 새 게임을 눌렀을 때 이미 게임을 진행한 기록이 있어야지만 활성화된다
이것 역시 StageClearID로 구별하도록 하겠다
this.NewBtn.onClick.AddListener(() => { if (stageGameManager.StageClearID > 1) { reallynew.SetActive(true); } else { ResetStageClearIDAndLoadScene(stageGameManager, "Prologue"); } }); this.ContinueBtn.onClick.AddListener(() => { if(stageGameManager.StageClearID == 1) { return; } else if (stageGameManager.StageClearID <= 6.5f && stageGameManager.StageClearID >= 2) { StartCoroutine(FadeInAndLoadScene("Stage")); } else if (stageGameManager.StageClearID >= 7) { StartCoroutine(FadeInAndLoadScene("Main Stage")); }
시작창을 관리할 SinglePlayerSetting 스크립트 중 일부이다
NewBtn(새로하기) 버튼을 눌렀을때 StageClearID가 1보다 크다면 reallynew라는 오브젝트를 활성화 할것이다
그리고 그 외에 모든 경우에는 정상적으로 게임을 새시작한다
reallynew는 위에 첨부한
이 화면이다. 이미 진행기록이 있는데 이어서 할것이냐고 묻는 reallynew
ContinueBtn 도 마찬가지이다. StageClearID가 1이라면 아무런 일도 일어나지 않게 return으로 반환해주었고
2 이상 6.5 이하라면 튜토리얼씬, 7이상이라면 메인스테이지맵으로 이동해준다
this.reallyNo.onClick.AddListener(() => { reallynew.SetActive(false); }); this.reallyYes.onClick.AddListener(() => { ResetStageClearIDAndLoadScene(stageGameManager, "Prologue"); });
rellyNo 버튼과 rellyYes 버튼이다. 여긴 별다를거 없이 Yes버튼을 클릭시 게임을 새시작하게 해준다
자 그럼 버튼 세팅이 끝났으니 본격적인 게임 저장/불러오기 구현을 해보자
using System; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.SceneManagement; public class StageGameManager : MonoBehaviour { public static StageGameManager instance = null; public float StageClearID; public bool isending = false; private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(gameObject); LoadStageClearID(); LoadIsEnding(); } else { if (instance != this) Destroy(this.gameObject); } } public void PauseGame() { Time.timeScale = 0f; // 게임 일시정지 } public void ResumeGame() { Time.timeScale = 1f; // 게임 일시정지 해제 } public void SaveStageClearID() { PlayerPrefs.SetFloat("StageClearID", StageClearID); PlayerPrefs.Save(); } public void SaveIsEnding() { PlayerPrefs.SetInt("IsEnding", isending ? 1 : 0); PlayerPrefs.Save(); } private void LoadStageClearID() { if (PlayerPrefs.HasKey("StageClearID")) { StageClearID = PlayerPrefs.GetFloat("StageClearID"); } } private void LoadIsEnding() { if (PlayerPrefs.HasKey("IsEnding")) { isending = PlayerPrefs.GetInt("IsEnding") == 1; } } }
사실 저장/불러오기를 한번도 구현해본적이 없으니 내가 선택한 방식은
게임이 얼마나 진행되었는지 구별할 수 있는 변수 StageClearID를 이용한것이었다
그러기 위해 우선 StageClearID를 품고 있는 StageGameManager를 손봐주었다
저장, 불러오기, 게임 정지, 재생등 다양한 메서드를 만들어 언제든지 원할때 사용할 수 있도록 하였고
이제 게임이 저장되는 방식을 차례대로 보면서 진행하도록 하겠다
1. 새 게임을 누르고 프롤로그를 감상한다
2. 튜토리얼을 마친뒤 첫번째 스테이지를 플레이한다
3. 승리 조건을 만족시키고 스테이지를 클리어하는 순간
int totalenemy = GameObject.FindGameObjectsWithTag("Enemy").Length; if (totalenemy <= 0) { gameManager = FindObjectOfType<StageGameManager>(); if (gameManager.StageClearID == StageState.chooseStage && gameManager.StageClearID != 5) { gameManager.StageClearID += 1; gameManager.SaveStageClearID(); } if (gameManager.StageClearID == 5) { gameManager.StageClearID += 0.5f; gameManager.SaveStageClearID(); } SceneManager.LoadScene("Clear"); } }
SPGameManager에 적힌대로 totalenemy의 수가 0이 되는 순간 StageClearID에 1을 더하고
SaveStageClearID() 메서드를 실행한다
public void SaveStageClearID()
{
PlayerPrefs.SetFloat("StageClearID", StageClearID);
PlayerPrefs.Save();
}SaveStageClearID는 말 그대로 변수를 저장하는 메서드이다. 이렇게 StageClearID가 저장되면
게임을 중지했다가 다시 실행해도 값이 저장되어 실행되는것을 확인할 수 있다
'Galaxy Ball > 2. 싱글플레이 - 스토리모드' 카테고리의 다른 글
(39) 스토리+연출 완성 (0) 2024.08.02 (38) 오디오 제어 & 최종보스 제작 (0) 2024.07.30 (35) 새로운 적 유닛 정보창 (0) 2024.07.12 (34) 연출&대사 시스템 총정리 (0) 2024.07.11 (33) 챕터1 스토리 (0) 2024.06.26