유니티 로딩씬 스크립트
작성자 정보
- 마스터 작성
- 작성일
컨텐츠 정보
- 280 조회
- 목록
본문
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 코루틴으로 프로그래스바 구현 및 씬 불러오기
AsyncOperation op = SceneManager.LoadSceneAsync(nextScene)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;
}
}
}
}
비동기 작업 코루틴 (다음씬을 불러올때 멈춤을 방지하기 위해서 비동기로 데이터를 불러오는 방식)
LoadSceneAsync(씬이름) 비동기로 씬을 불러올때 사용
LoadScene(씬이름)과 다름 LoadScene은 바로 이동됨
op.allowSceneActivation = false;
씬을 90%까지만 로딩함, 씬을 100% 로딩하면 씬 전환이루어 지기 때문에 true일경우 씬전환이 이루어짐
op.isDone는 동기화 상태를 불값으로 반환함, 씬을 다 불러왔는지 확인 따라서 !를 붙였음
progressBar.fillAmount = op.progress;
이미지의 fillAmount에 진행상황을 더함
매소드가 작성이 완료되면 start()에서 StartCoroutine() 사용하여 코루틴을 실행함
한번 만들어 두면 어디서든 사용 가능한 로딩씬이 완성됨!
관련자료
-
이전
-
다음