안 쓰던 블로그

unity 스테이지 Lock 구현하기 본문

유니티/개발

unity 스테이지 Lock 구현하기

proqk 2020. 3. 2. 16:25
반응형

[구현 해야 할 것]

처음에는 1번 스테이지만 열려있고 나머지는 누를 수 없게 처리

1번을 깨면 2번이 열리고, 2번을 깨면 3번이 열리게

2번을 깨고 스테이지 선택창으로 나가면 3번이 열려있어야 함

끝까지 다 깨고 나면 다시 잠기면 안 됨

 

 

 

일단 스테이지 버튼 구조

버튼 컴포넌트를 붙인 게임오브젝트 Prefab로 만들어서 복사했다

 

 

스크립트는 버튼들을 가진 부모 Content를 먼저 가져와서

GetComponentsInChildren<Button>으로 모든 자식들의 버튼 컴포넌트를 뗀다

그리고 현재까지 오픈된 스테이지 번호+1부터 끝까지 버튼을 막게 했다

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class LevelLock : MonoBehaviour
{
    int levelat; //현재 스테이지 번호, 오픈한 스테이지 번호
    public GameObject stageNumObject;

    void Start()
    {
        Button[] stages = stageNumObject.GetComponentsInChildren<Button>();

        levelat = PlayerPrefs.GetInt("levelReached");
        print(levelat);
        for (int i = levelat + 1; i < stages.Length; i++)
        {
            stages[i].interactable = false;
        }
    }
}

 

현재까지 오픈된 스테이지 번호를 어떻게 저장할까 고민하다가 PlayerPrefs에다가 저장하기로 했다

PlayerPrefs는 Key-Value 형식으로 데이터를 로컬에 저장한다

int, float, string 타입의 데이터만 가능하다고 알고 있음

 

----

PlayerPrefs.SetInt("키 이름", 저장할 값); //키에다가 값을 저장

PlayerPrefs.GetInt("키 이름"); //키값을 가져옴

 

PlayerPrefs.SetFloat, Setstring / PlayerPrefs.GetFloat, Getstring 도 있다

 

PlayerPrefs.DeleteKey("키 이름"); //값 삭제

PlayerPrefs.DeleteAll(); //모든 데이터 삭제

 

PlayerPrefs.HasKey("키 이름"); 키값이 존재하면 참

----

 

이 스크립트에서 GetInt를 했으니까 어딘가에서는 SetInt를 해줘야 한다

SetInt는 게임매니저에서 했다

 

//...

        if (X.activeSelf == true)
        {
            X.SetActive(false);
        }
        else
        {
            O.SetActive(false);
            nowStage += 1; //맞으면 다음 스테이지로 자동 이동
            PlayerPrefs.SetInt("levelReached", nowStage); //현재 스테이지를 깨면 스테이지락 해제
            if (nowStage == data.Count) //만약 마지막 스테이지라면 스테이지 선택 창으로 돌아감
            {
                ButtonManager.onClick();
            }
            else this.q(); //그렇지 않다면 다음 스테이지로    
        }
        
 //...

정답이면 현재 스테이지값+1을 해서 다음 스테이지로 가게 했는데,

현재 스테이지+1한 값을 PlayerPrefs.SetInt로 저장했다

그러면 만약 다음 스테이지를 안 풀고 스테이지 창으로 돌아가도 안 푼 스테이지 부분은 Lock이 풀려있게 된다

 

반응형
Comments