[Skill] 로딩 화면 구현하기 (로딩 씬 방식)



우선 로딩 씬을 세팅하는게 먼저다. 다음과 같이 세팅을 하고 스크립트를 작성하자.

image

여기서 로딩 바에는 2개의 이미지가 들어간다 하나는 로딩 바의 프레임 하나는 로딩 바이다. 로딩 바는

Image Type을 Filled로 바꾸고 Fill Method를 Horizintal로 바꾸고 Fill Amount를 0으로 바꿔주면 된다.

이제 스크립트를 작성해보자.

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

public class LoadingSceneController : MonoBehaviour
{
    static string nextScene;

    [SerializeField]
    Image progressBar;

    public static void LoadScene(string sceneName)
    {
        nextScene = sceneName;
        SceneManager.LoadScene(2);
    }
    void Start()
    {
        StartCoroutine(LoadingSceneProcess());
    }

    IEnumerator LoadingSceneProcess()
    {
        //씬을 불러오는 진행상황은 LoadSceneAsync가 AsyncOperation형으로 반환한다
        AsyncOperation op = SceneManager.LoadSceneAsync(nextScene);

        //씬을 비동기로 불러들일때 씬의 로딩이 끝나면 자동으로 불러온 씬으로 이동할 것인지 설정하는 것
        op.allowSceneActivation = false;
        //allowSceneActivation가 false이면 씬을 90퍼 센트까지만 로드한 상태로 다음 씬으로 넘어가지 않고 기다림 다시 true로 변경하면 그 때 남은 부분을 로딩하고 씬을 불러옴

        float timer =0f;
        while(!op.isDone)//로딩이 끝나지 않았으면 계속해서 실행
        {
            yield return null;


            if (op.progress < 0.9f) //씬의 로딩 진행 상황이 0.9보다 작으면
            {
                   progressBar.fillAmount = op.progress;
            }
            else
            {
                timer += Time.unscaledDeltaTime;
                progressBar.fillAmount = Mathf.Lerp(0.9f, 1.0f, timer); //1초에 걸쳐 나머지 채우게 만듬
                if (progressBar.fillAmount >= 1.0f)
                {
                    op.allowSceneActivation = true;
                    yield break;
                }
            }
        }
    }
}

위 코드에 다 설명이 달려 있지만 위 코드에서 중요한 점은 다음 씬을 불러올 때 LoadSceneAsync를 사용한다는 점이다. 이러면 비동기 방식으로 씬을 불러오기 때문에 중간에 다른 동작을 할 수 있게 된다. 그리고 씬을 비동기 방식으로 불러 올 때 코루틴을 이용해야 한다는 점도 중요하다. 이제 실제 결과를 봐보자. 우선 씬의 전환을 확인해야 하니 로딩바가 있는 씬을 제외하고 씬 2개를 더 만든다 그리고 씬1에는 큐브 오브젝트 씬2에는 스피어 오브젝트를 놔두고 바뀌는지 확인 하겠다.

그리고 씬1에 있는 큐브 오브젝트에 컴포넌트로 다음과 같은 스크립트를 넣어 주겠다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SceneLoaderTest : MonoBehaviour
{
    void Update()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            LoadingSceneController.LoadScene("Scene2");
        }        
    }
}

위에서 클래스의 이름만으로 함수를 불러올 수 있는건 LoadingSceneController클래스에서 LoadScene함수를 static으로 설정했기 때문이다. 이제 게임을 실행시키고 스페이스바를 누르면 다음과 같은 화면이 나온다.

image

LoadingSceneController 클래스에서 설정한 대로 90퍼까지 로딩 바가 채워지면 1초에 걸쳐 나머지 로딩 바가 채워지는 것을 확인 할 수 있다.




© 2022. by KSC

Powered by sora