Unity

Unity Scene 불러오는 법 SceneManager.GetActiveScene()

박도치 2023. 11. 1. 20:56

Unity에서 자신의 신을 불러와야 하는 경우가 있다. 필자의 경우 카드 뒤집기 미니게임프로젝트 중 StrartScene에서 Easy모드 normal모드 Hard모드 세 가지 Scene을 사용하는데 게임이 끝나고 다시하기를 눌렀을 때 지금 진행하는 Scene을 띄우기 위해 Scene이름을 불러오는 코드를 사용했다.

using UnityEngine.SceneManagement;

Scene scene;

private void Awake()
    {
        scene = SceneManager.GetActiveScene();
    }

    public void RetryGame()
    {
        SceneManager.LoadScene(scene.name);
	}

 

 

해당 코드를 통해 retry 시에 현재 진행하고있는 씬을 로드하게끔 할 수 있다.

 

1. 응용

게임 종료시 만약 easy모드이면 easy모드의 이번점수와 최고점수를 return해주고, normal이면 normal 등 난도별로 점수가 나뉘어져 있을거다. 이 때도 마찬가지로 Scene의 이름을 가져와서 사용할 수 있다.

 

void GameEnd()
    {
    	//Scene name 불러오는 함수
        string sceneName = scene.name;
        
        isRunning = false;
        
        trialText.text = trialNum.ToString() + "회";     
        warningBackground.gameObject.SetActive(false);
        Time.timeScale = 0f;

		//끝날 때 점수띄우는 Panel setActive
        endPanel.SetActive(true);

        if (time > maxTime)         
            time = maxTime;

        thisScoreText.text = time.ToString("N2");

        /*하드 게임 플레이시 최고점수 및 현재점수 기록*/
        if (sceneName == "HardScene")
        {
            GameHardScore();
        }
        /*헬 게임 플레이시 최고점수 및 현재점수 기록*/
        else if (sceneName == "HellScene")
        {
            GameHellScore();
        }
        else
        {
            GameNormalScore();
        }

    }

 

위 코드를 보면 아래 하드게임 플레이시 HardScore 함수를 호출하고, 헬게임 플레이시 HellScore함수를 호출하는 방식이다. 이런식으로 필요할 때 Scene의 이름을 가져와서 활용할 수 있다.

 

Score함수는 아래와 같다.

 

void GameHardScore()
    {
        string sceneName = scene.name;
        string bestscore = "hardscore";

        if (sceneName == "HardScene")
        {
            //endTxt.SetActive(true);
            if (time >= maxTime)
            {
                audioSource.PlayOneShot(lowscoreSound);
            }
            else if (PlayerPrefs.HasKey(bestscore) == false)
            {
                // 게임종료시 베스트 스코어면 나오는 노래
                audioSource.PlayOneShot(bestscoreSound);
                PlayerPrefs.SetFloat(bestscore, time);
            }
            else if (time < PlayerPrefs.GetFloat(bestscore))
            {
                // 게임종료시 베스트 스코어보다 낮으면 나오는 노래
                audioSource.PlayOneShot(bestscoreSound);
                PlayerPrefs.SetFloat(bestscore, time);
            }
            else
            {
                // 게임종료시 베스트 스코어보다 낮으면 나오는 노래
                audioSource.PlayOneShot(lowscoreSound);
            }

            float maxScore = PlayerPrefs.GetFloat(bestscore);
            maxScoreText.text = maxScore.ToString("N2");
            EndGameBgmStop();
        }
    }