Unity 1주차 미니프로젝트(2)

Sungchan Ahn(안성찬)·2024년 9월 11일

내일배움캠프

목록 보기
24/104

팀원이 구현한 스테이지 구현하기 기능 분석해보기

[그림 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으로 넘어가게 만들었다.

1. PlayerPrefs 클래스

사용자가 현재 진행하고 있는 Scene의 정보를 받아서 저장하기 위해 PlayerPrefs를 사용하였다.
PlayerPrefs는 유니티에서 제공하는 데이터 관리 클래스이다. int, float, string 타입의 변수를 저장하고 불러오는 기능을 한다.

2. Key와 Value

  • Key
    데이터 식별에 사용되는 문자열 or 식별자

  • Value
    주어진 Key에 해당하는 저장값 int, float, string의 데이터 타입을 가질 수 있다.

3. PlayerPrefs 메서드 사용

메서드유니티 메뉴얼 설명
DeleteAll저장된 모든 Key와 Value 삭제
DeleteKey지정된 Key와 그 Key에 해당하는 Value 삭제
GetFloat지정된 Key에 해당하는 float Value 반환
GetInt지정된 Key에 해당하는 int Value 반환
GetString지정된 Key에 해당하는 string Value 반환
HasKeyKey가 설정되어 있으면 bool true 값을 반환
Save모든 설정을 저장
SetFloat식별자 Key에 float Value를 설정
SetInt식별자 Key에 int Value를 설정
SetString식별자 Key에 string Value를 설정

4. 프로젝트에 적용

  • SelectStage Scene을 관리하는 SceneController Script 작성
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);
        }
    }
}
  • Button Script의 GoStage()를 호출하는 버튼을 누를 경우, 현재 위치한 Scene의 다음 Scene의 이름을 Key로 받아 그에 대한 Value로 1을 저장하여 StageController에서 다음 Stage에 대한 Lock을 풀게 한다.
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");
    }
profile
게임 개발 기록

0개의 댓글