유니티

유니티 로딩씬 스크립트

작성자 정보

  • 마스터 작성
  • 작성일

컨텐츠 정보

본문

1.전체코드

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

using UnityEngine.SceneManagement;


public class LoadingSceneManager : MonoBehaviour

{

    static string nextScene;


    public GameObject completeText;


    [SerializeField]

    Image progressBar;


    public static void LoadSceme(string sceneName)

    {

        nextScene = sceneName;

        SceneManager.LoadScene("LoadingScene");

    }


    // Start is called before the first frame update

    void Start()

    {

        StartCoroutine(LoadSeceneProcess());

    }


    // Update is called once per frame

    IEnumerator LoadSeceneProcess()

    {

        AsyncOperation op = SceneManager.LoadSceneAsync(nextScene);

        // 로딩을 90%까지 로딩하기

        op.allowSceneActivation = false;

        

        float timer = 0f;

        while (!op.isDone)

        {

            yield return null;


            if(op.progress < 0.9f)

            {

                progressBar.fillAmount = op.progress;

            }

            else

            {

                timer += Time.unscaledDeltaTime;

                progressBar.fillAmount = Mathf.Lerp(0.9f, 1f, timer);

                if (progressBar.fillAmount >= 1f)

                {

                    completeText.SetActive(true);

                }

                if(progressBar.fillAmount >= 1f && Input.GetMouseButtonDown(0))

                {

                    op.allowSceneActivation = true;

                    yield break;

                }

            }

        }

    }

}



2.준비물

로딩씬, 프로그래스바(UI로 구현), 로딩씬매니저(빈오브젝트), 툴팁은 자유롭게

 

 

3.코드 분석

3-1 변수 선언

static string nextScene;

public GameObject completeText;

[SerializeField]

Image progressBar;

string nextScene - 다음씬의 이름, 함수에서 매개변수로 사용하기 위해서 string으로 생성

GameObject completeText - 툴팁 혹은 완료 메세지를 띄우기 위해서 생성

[SerializeField] Image progressBar - 프로그래스바 상태를 표기 하기 위해 생성

 

3-2 씬 불러오는 매소드 생성

public static void LoadSceme(string sceneName)

{

    nextScene = sceneName;

    SceneManager.LoadScene("LoadingScene");

}

다른씬에서 이 함수를 사용하여 씬을 이동하기전에 로딩 페이지를 구현

매개변수로 씬이름을 저장하여 로딩씬을 먼저 로딩한뒤 나중에 씬을 로딩하기 위하여 구현

 

3-3 코루틴으로 프로그래스바 구현 및 씬 불러오기

 IEnumerator LoadSeceneProcess()

 {

     AsyncOperation op = SceneManager.LoadSceneAsync(nextScene);

     // 로딩을 90%까지 로딩하기

     op.allowSceneActivation = false;

     

     float timer = 0f;

     while (!op.isDone)

     {

         yield return null;


         if(op.progress < 0.9f)

         {

             progressBar.fillAmount = op.progress;

         }

         else

         {

             timer += Time.unscaledDeltaTime;

             progressBar.fillAmount = Mathf.Lerp(0.9f, 1f, timer);

             if (progressBar.fillAmount >= 1f)

             {

                 completeText.SetActive(true);

             }

             if(progressBar.fillAmount >= 1f && Input.GetMouseButtonDown(0))

             {

                 op.allowSceneActivation = true;

                 yield break;

             }

         }

     }

 }

AsyncOperation op = SceneManager.LoadSceneAsync(nextScene) 

비동기 작업 코루틴 (다음씬을 불러올때 멈춤을 방지하기 위해서 비동기로 데이터를 불러오는 방식)

LoadSceneAsync(씬이름) 비동기로 씬을 불러올때 사용

LoadScene(씬이름)과 다름 LoadScene은 바로 이동됨

 

op.allowSceneActivation = false;

씬을 90%까지만 로딩함, 씬을 100% 로딩하면 씬 전환이루어 지기 때문에 true일경우 씬전환이 이루어짐

 

op.isDone는 동기화 상태를 불값으로 반환함, 씬을 다 불러왔는지 확인 따라서 !를 붙였음

 

progressBar.fillAmount = op.progress;

이미지의 fillAmount에 진행상황을 더함

 

매소드가 작성이 완료되면 start()에서 StartCoroutine() 사용하여 코루틴을 실행함

한번 만들어 두면 어디서든 사용 가능한 로딩씬이 완성됨!

 

관련자료

댓글 0
등록된 댓글이 없습니다.

최근글


새댓글


알림 0