Unity 2D RPG - 7. 서브 메뉴와 저장 기능 만들기

2023. 8. 23. 18:51C# & Unity 공부

UI 구축하기

 

우선 Esc를 눌렀을 때 화면이 검게 나오는 것을 구현하자.

우클릭 하고 Ui > Image를 통하여 만든 후, Rect Transform에서 눌러서 화면을 가득 채운다.

그 후에, Sprite를 넣고 검정색으로 바꾼 뒤 알파값을 내려준다.

 

 

이후 버튼 판넬 (메뉴창)과 버튼 3개를 만들어주도록 하자.

 

메뉴창

 

버튼

 

텍스트

 

버튼의 내용과 종료하기 버튼의 색깔을 바꾸어주자.

 

 

그리고 퀘스트 내용을 띄울 Image와 Text를 추가해주자.

 

 

 

계속하기

 

esc는 단타성 버튼이기 때문에 Update() 함수에 구현하도록 하자.

우선 아래 코드를 GameManager.cs에 작성하자.

 

public GameObject menuSet;

void Update()
{
	 //Sub Menu
     if (Input.GetButtonDown("Cancel"))
     {
         if (menuSet.activeSelf)
         {
            menuSet.SetActive(false);
         }
         else
         {
            menuSet.SetActive(true);
         }
    }
}

 

위 코드는 Esc를 누르면 activeSelf의 값에 따라 메뉴 창을 끄거나 켜주는 코드이다.

activeSelf는 bool 형태를 반환하는 함수로 현재 오브젝트의 활성화 상태에 따라서 값이 바뀐다.

 

Edit > Project Settings > Input Manager을 통하여 Cancel이라는 버튼이 있는지 확인해주자.

 

이제 '계속하기' 버튼을 누르면 메뉴창이 꺼지게 해야한다.

 

 

GameObject 기본 함수는 인스펙터 창에서 할당 가능하다.

 

마지막으로 GameManager와  Continue 버튼에 오브젝트를 알맞게 넣어주면 된다.

 

퀘스트 확인 창

 

GameManager에서 Debug.Log를 통하여 나오던 것을

Text 변수를 만들어주고 불러와서 바꿔주면 된다.

 

public Text questText;

void Start()			//수정 후
{
    questText.text = questManager.CheckQuest();
}

//End Talk				//수정 후
if(talkData==null)
{
        isAction = false;
        talkIndex = 0;
        questText.text = questManager.CheckQuest(id);
        return;
}

 

스크립트 저장 후에, GameManager Inspector 창에서  Quest Text 오브젝트를 넣어주면 된다.

 

 

종료하기

 

종료하기는 함수를 하나 만들어주고 연결시키면 끝난다.

 

public void GameExit()
{
    Application.Quit();
}

 

그리고 Exit 버튼 Inspector 창 안에 Onclick()에다가 방금 만든 함수를 추가해주자.

 

 

다만 게임을 종료하는 기능은 Editor에서 확인이 불가능하다.

그래서 확인하기 위해서는 빌드하여서 직접 확인해 보아야 한다.

 

저장하기

 

우리가 저장해야 하는 정보에 대해서 알아보자.

퀘스트랑 플레이어의 위치가 있을 것이다.

 

따라서, 퀘스트와 관련된 Quest Id와 Quest Action Index,

그리고 플레이어의 위치를 나타내는 x좌표와 y좌표가 있을 것이다.

 

저장하는 함수 GameSave()와 불러오는 함수 GameLoad()를 작성해보자.

 

//x좌표와 y좌표를 사용하기 위하여 변수 생성
public GameObject player;

public void GameSave()
{
     PlayerPrefs.SetFloat("PlayerX", player.transform.position.x);
     PlayerPrefs.SetFloat("PlayerY", player.transform.position.y);
     PlayerPrefs.SetInt("QustId", questManager.questId);
     PlayerPrefs.SetInt("QustActionIndex", questManager.questActionIndex);
     PlayerPrefs.Save();
     //PlayerPrefs : 간단한 데이터 저장 기능을 지원하는 클래스
     //저장되는 위치는 기기마다 다름
     //빌드하는 곳에서 Player Settings을 누르면 Company, Product Name이 있는데
     //그 순으로 레지스트리에 저장이 된다.
        
     menuSet.SetActive(false);
}

public void GameLoad()
{
     float x = PlayerPrefs.GetFloat("PlayerX");
     float y = PlayerPrefs.GetFloat("PlayerY");
     int questId = PlayerPrefs.GetInt("QustId");
     int questActionIndex = PlayerPrefs.GetInt("QustActionIndex");

     player.transform.position = new Vector3(x, y, 0);
     questManager.questId = questId;
     questManager.questActionIndex = questActionIndex;
 }
 
 //Set은 설정하는 것, Save는 설정한 거 저장, Get은 불러오는 것
 //불러오는 GameLoad()는 Start() 함수 안 첫 줄로 써주자.

 

저장되는 위치 확인 방법 : 레지스트리 편집기 > HKEY_CURRENT_USER > SOFTWARE > (Company 이름)

 

빌드하고 실행하면 잘 적용이 되는 것 같지만,

중간 퀘스트인 동전줍기를 할 때, 동전을 줍기 전에 저장하고 나가면

동전을 줍지 않은 상태지만 동전이 뜨지 않는다.

 

ControlObject()함수를 수정해주고, 이 함수를 로딩할 때 실행하게 해주자.

 

public void ControlObject()
{
    switch(questId)
    {
         case 10:
            if(questActionIndex == 2)
                questObject[0].SetActive(true);
            break;
         case 20:
            if (questActionIndex == 0)
                questObject[0].SetActive(true);
            else if (questActionIndex == 1)
                questObject[0].SetActive(false);
            break;
    }
}

public void GameLoad()
{
     if (!PlayerPrefs.HasKey("PlayerX"))
        return;

    float x = PlayerPrefs.GetFloat("PlayerX");
    float y = PlayerPrefs.GetFloat("PlayerY");
    int questId = PlayerPrefs.GetInt("QustId");
    int questActionIndex = PlayerPrefs.GetInt("QustActionIndex");

    player.transform.position = new Vector3(x, y, 0);
    questManager.questId = questId;
    questManager.questActionIndex = questActionIndex;
    questManager.ControlObject();
}