Unity

Unity 로딩씬 구현하기

sungmin08 2025. 4. 14. 14:34

 

씬로딩 미리보기

 

로딩은 앱/게임에서 흔히 볼 수 있는데 씬로딩은 단순히 로딩되는 걸 보여주는 것보단 다른 중요한 이유가 존재한다.

이 기능의 씬 로딩은 비동기(Async) 씬 로딩이라 부르며 같이 한번 알아보도록 하자.

 

✅ 비동기(Async) 씬 로딩이 필요한 이유

씬이 로딩되는 동안 앱이 멈추지 않고, 부드럽게 움직이게 하기 위해서

-> 더욱 이해하기 쉽게 얘기하자면 메모리가 많을 경우 씬이 로딩 되는 속도가 늦어질 수도 있다. 씬 로딩이 늦어질 경우 사용자는 화면이 멈췄다고 착각 할 수 있기 때문에 비동기 씬 로딩을 사용하는 것이다. 또한 게임의 경우 이 로딩 시간동안 자연스럽게 게임 속 Tip을 제공할 수도 있다. 

 

1. 로딩바 세팅하기

로딩바 세팅하기

1. 먼저 로딩바의 프레임과 그 안에 들어갈 로딩바 Image 2개를 만들어준다. 

2. 로딩바 Image 컴포넌트에서 Image Type = Filled로 바꾼 후 Amount를 0으로 설정해준다. 

 

2. 코드 작성

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

public class LoadingSceneController : MonoBehaviour
{
    [SerializeField] Image ProgressBar;

    //변수와 함수를 static으로 만듦으로써 이 스크립트가 부착된 오브젝트가 생성되지 않더라도 외부에서 불러올 수 있음
    static string nextScene;

    public static void LoadScene(string sceneName)
    {
        nextScene = sceneName;
        SceneManager.LoadScene("LoadingScene");
        Debug.Log(nextScene);
    }

    private void Start()
    {
        StartCoroutine(LoadSceneProgress());
    }

    IEnumerator LoadSceneProgress()
    {
        //SceneManager.LoadScene("") -> 비동기 방식 (씬 불러오기 전에 아무런 행동도 못함)
        //SceneManager.LoadSceneAsync("") -> 동기 방식 (씬 불러오기 전에 다른 행동 가능)
        AsyncOperation op =SceneManager.LoadSceneAsync(nextScene);
       
        // 씬을 비동기로 불러들일 때 씬의 로딩이 끝날 때 자동으로 불러온 씬을 실행할지
        // false 일 때 -> 90%까지 로드되고 다음 씬으로 넘어가지 않고 기다림
        // true 일 때 -> 남은 부분을 로드하고 씬을 로드함
        // flase, true 하는 이유
        // 첫번째 이유 -> 씬이 생각보다 빨리 로드 되면 내가 전달하고자 하는 앱/게임의 Tip을 사용자가 못보고 지나칠수있음
        // 두번째 이유 -> 규모가 큰 프로젝트에서는 에셋 번들로 나눠서 빌드하고 각 에셋 번들에서 리소스를 불러와야 하는데 씬 로딩이 리소스가 불려오기 전에 실행 되면 깨져서 보일 수 있음
        op.allowSceneActivation = false;

        float timer = 0f;
        while (!op.isDone)
        {
            yield return null; //반복 될 때마다 유니티엔진에 제어권을 넘기지 않으면 반복문이 끝나기 전에 화면이 갱신 되지 않아 진행바가 차오르는걸 볼 수 없다
            if (op.progress < 0.9f)
            {
                ProgressBar.fillAmount = op.progress;
                Debug.Log("90% 이전");
            }
            else
            {
                timer += Time.unscaledDeltaTime;
                ProgressBar.fillAmount=Mathf.Lerp(0.9f, 1f, timer);
                if(ProgressBar.fillAmount>=1f)
                {
                    Debug.Log("100%완료 탈출");
                    op.allowSceneActivation = true; //씬 로딩이 끝나면 씬을 실행함
                    yield break;
                }
            }
        }
    }
}

 

3. 실행 예시

2개의 Scene1, Scene2 생성 후 Scene1의 Canvas에 test 코드를 넣어준다.

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

public class test : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        LoadingSceneController.LoadScene("Scene2");
    }
}

실행하자마자 바로 Scene2로 비동기 로딩

* 위 코드는 예시코드로 상황에 맞게 Start함수 속 코드를 사용하면 된다.

 

 

출처 :

https://www.youtube.com/watch?v=xRiqSmUggpg

'Unity' 카테고리의 다른 글

Unity 자동슬라이드 Text 구현하기  (0) 2025.04.14
Unity 출석체크 시스템 구현하기  (2) 2025.04.08
Unity 푸시 알람 기능 구현  (0) 2025.03.31
오클루전 컬링  (0) 2024.10.26
씬 관리(분리된 씬 한번에 불러오기)  (0) 2024.10.25