본문 바로가기
유니티

[ Unity ] Scene 전환 간에 Loading 화면 구현 하는 법.

by Hexs 2023. 4. 10.
반응형

1 / 메인 화면 GameManager 코드.

public class GameManager : MonoBehaviour
{
    public static GameManager GM_Instance;

    public string scenename;
    // Start is called before the first frame update
    void Start()
    {
        if (GM_Instance == null)
        {
            GM_Instance = this;
            DontDestroyOnLoad(gameObject);
        }
    }

    // Update is called once per frame
    void Update()
    {

    }
    public void One()
    {
        scenename = "MineOne";
        SceneManager.LoadScene("Loading");
    }

}

 

2 / Loading Scene 코드.

public class Loading : MonoBehaviour
{
    [SerializeField] Slider Loading_bar;
    [SerializeField] float time;
    [SerializeField] string scenenames;
    [SerializeField] GameObject Loading_bar_text;
    // Start is called before the first frame update
    void Start()
    {
        scenenames = GameManager.GM_Instance.scenename;
        Loading_bar.maxValue = 1.0f;
        StartCoroutine(LoadScene(scenenames));
    }

    // Update is called once per frame
    void Update()
    {
        time += Time.deltaTime;
        Loading_bar.value = time;
        Loading_bar_text.transform.GetComponent<TextMeshProUGUI>().text = "Loading... " + (Mathf.Floor(time * 100f) / 100f) * 100f + "%";

    }

    IEnumerator LoadScene(string name)
    {
        yield return null;
        AsyncOperation op = SceneManager.LoadSceneAsync(name); // 비동기 Scene 로딩 ( 로딩할 Scene 이름 )
        op.allowSceneActivation = false;  // Scene 이 로딩 되었을때 바로 실행할지 .
        yield return new WaitForSecondsRealtime(1.0f); // 1초 대기
        op.allowSceneActivation = true; // 로딩된 Scene 실행.
    }

}

https://docs.unity3d.com/kr/530/ScriptReference/AsyncOperation.html

 

UnityEngine.AsyncOperation - Unity 스크립팅 API

Asynchronous operation coroutine.

docs.unity3d.com

 

allowSceneActivation 로딩 하려는 Scene이 로딩 되었을경우 바로 로딩할지 여부
isDone 로딩 되었는지 여부.
progress 로딩 정도를 0~1 사이의 값으로 반환해줌.

AsyncOperation 내부 변수들을 사용하여 구현할수 있다.

 

총 Scene을 3개를 사용하였다. 

1. Main

2. Loading

3. Mineone



1번 Scene이 메인이고 2번 Scene 로딩 화면 구성. 3번 Scene 던전 느낌이다.



모든 던전이나 메인 Scene은 2번 로딩 Scene을 거쳐서 Scene 전환이 되게 구현한다.





첫 번째 GameManager 스크립트는. Main Scene에서 생성된다.

MainScene 내에서 내가 정한 행동을 수행하면 One()이라는 함수를 호출하게 되고.

Scene은 Loading Scene으로 넘어가게 된다.



LoadingScene 에서는 Loading이라는 코드가 존재하게 되고. 이 코드는.

GameManager 스크립트에 있는 목적지 Scene 이름을 불러와서.



코 루틴으로 불러온 Scene을 비동기 로딩한다.

AsyncOperation op = SceneManager.LoadSceneAsync(name); // 비동기 Scene 로딩 ( 로딩할 Scene 이름 )

그 이후 로딩 바가 100%가 될떄까지 기다리기 위해서.

op.allowSceneActivation = false; 이 코드를 사용하여 로딩되어도 바로 실행 되지 않게 한다.

이후.

로딩 바가 100% 가 된다면.

op.allowSceneActivation = true; true로 바꿔주면 로딩된 화면으로 넘어간다.



Scene이 전환될떄 Loading 바를 만드는 방법이 두 가지 있는데

하나는 고정된 시간을 두는 법.

두 번쨰는 progress를 사용하여 실제 로딩 시간을 반영하는 법.



그런데 저는 Scene 데이터가 무겁지 않아서 로딩 시간이 빠르기떄문에 progress를 사용할 경우

로딩 바가 급격하게 오르고 거의 바로 Scene 전환이 되어서.

로딩 시간을 1초로 고정해서 사용하였습니다.

 

 

이런 식으로.

로딩 Scene에서 

로딩 % 가 1초 만에 100%까지 증가하고 Scene이 넘어가게 된다.

반응형