[그림 1] Stage를 선택할 수 있는 SelectStage Scene
Stage 1 ~ 3까지 만들고 각각의 Stage를 Scene으로 저장했다. [그림 1]에서와 같이 Stage를 선택할 수 있는 Scene에서 처음에 Stage 2, 3는 잠겨있고 Stage 1만 시도할 수 있다. Stage2, 3를 해금하기 위해서는 Stage 1을 클리어해야한다. [그림 1]에서 아래의 Circle Object에 Button Component를 달아 클릭 시 각 Stage GameScene으로 넘어가게 만들었다.
사용자가 현재 진행하고 있는 Scene의 정보를 받아서 저장하기 위해 PlayerPrefs를 사용하였다.
PlayerPrefs는 유니티에서 제공하는 데이터 관리 클래스이다. int, float, string 타입의 변수를 저장하고 불러오는 기능을 한다.
Key
데이터 식별에 사용되는 문자열 or 식별자
Value
주어진 Key에 해당하는 저장값 int, float, string의 데이터 타입을 가질 수 있다.
| 메서드 | 유니티 메뉴얼 설명 |
|---|---|
| DeleteAll | 저장된 모든 Key와 Value 삭제 |
| DeleteKey | 지정된 Key와 그 Key에 해당하는 Value 삭제 |
| GetFloat | 지정된 Key에 해당하는 float Value 반환 |
| GetInt | 지정된 Key에 해당하는 int Value 반환 |
| GetString | 지정된 Key에 해당하는 string Value 반환 |
| HasKey | Key가 설정되어 있으면 bool true 값을 반환 |
| Save | 모든 설정을 저장 |
| SetFloat | 식별자 Key에 float Value를 설정 |
| SetInt | 식별자 Key에 int Value를 설정 |
| SetString | 식별자 Key에 string Value를 설정 |
public class SceneController : MonoBehaviour
{
public GameObject StageLev;
public GameObject StageLock;
public Text NowStage_Text;
public Text UnlockStage;
public int NowStage_level = 1;
public int MaxStage_level = 3;
bool isUnLock;
public enum Achive { GameScene, GameScene1, GameScene2, GameScene3, GameScene4 }
public Achive[] achives;
void Awake()
{
achives = (Achive[])Enum.GetValues(typeof(Achive));
if (!PlayerPrefs.HasKey("MyData"))
init();
}
void init()
{
//스테이지 0이면 잠긴것, 1이면 이전에 클리어 한것
PlayerPrefs.SetInt("MyData", 1);
PlayerPrefs.SetInt(achives[1].ToString(), 1);
for (int i = 2; i <= MaxStage_level; i++)
{
PlayerPrefs.SetInt(achives[i].ToString(), 0);
}
PlayerPrefs.Save();
}
public void Update()
{
NowStage_Text.text = $"스테이지 {NowStage_level} / {MaxStage_level}";
UnlockStage.text = NowStage_level.ToString();
}
public void Left_Stage()
{
if (NowStage_level > 1)
NowStage_level -= 1;
else
NowStage_level = 3;
UnlockState();
}
public void Right_Stage()
{
if (NowStage_level < 3)
NowStage_level += 1;
else
NowStage_level = 1;
UnlockState();
}
public void LoadLevel()
{
SceneManager.LoadScene($"GameScene{NowStage_level}");
}
public void UnlockState()
{
String ahiveName = achives[NowStage_level].ToString();
isUnLock = PlayerPrefs.GetInt(ahiveName) == 1;
if (!isUnLock)
{
StageLock.SetActive(true);
StageLev.SetActive(false);
}
else
{
StageLock.SetActive(false);
StageLev.SetActive(true);
}
}
}
using UnityEngine.SceneManagement;
using System.Text.RegularExpressions;
public class Button : MonoBehaviour
{
Scene scene;
public void GoStage()
{
scene = SceneManager.GetActiveScene();
string stageName = scene.name;
string tempStr = Regex.Replace(stageName, @"\D", "");
int rstInt = int.Parse(tempStr);
PlayerPrefs.SetInt($"GameScene{rstInt + 1}", 1);
PlayerPrefs.Save();
SceneManager.LoadScene("StageSelect");
}