기능 구현의 핵심요소
SceneManager.LoadSceneAsync()
씬이 로드될때까지 동작을 못하는 SceneManager.Load와 달리 씬을 불러오는 도중에 다른 작업이 가능합니다
AsyncOperation
현재 로드 되고있는 씬의 정보를 가지고있는 클래스입니다.
코드
SceneLoad 매서드를 static으로 만들어서, 어디에서든지 접근할 수 있게 설정합니다.
이후 LoadingSceneController가 생성될때(LoadingScene에서) LoadSceneProcess 함수를 실행시켜
씬이 작동하는 것과 별개로(비동기) 다음에 로드될 씬을 준비합니다.
사용된 AsycOperation의 프로퍼티 목록
- isDone : 로딩이 완료되었는지
- progress : 로딩 진행률 0% ~ 100%
- allowSceneActivation : 로딩이 완료되었을 때 씬을 로드할 것 인지
로딩 진행률에 따라 Slider의 value값을 조정하여 진행도를 보여줬습니다.
단, 로딩이 너무 빠르면 씬이 보이지 않을 수 있기 때문에, 반복문 안에서 임의의 시간을 더 기다리도록 구현했습니다.
더보기
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class LoadingSceneController : MonoBehaviour
{
[SerializeField] private Slider LoadingBar;
public static string nextScene;
public static void SceneLoad(string sceneName)
{
nextScene = sceneName;
SceneManager.LoadScene("LoadingScene");
}
private void Start()
{
StartCoroutine(LoadSceneProcess());
}
IEnumerator LoadSceneProcess()
{
//비동기 방식 로드
AsyncOperation loadScene = SceneManager.LoadSceneAsync(nextScene);
loadScene.allowSceneActivation = false;
float timer = 0f;
while(!loadScene.isDone)
{
yield return null;
if(loadScene.progress < 0.9f)
{
LoadingBar.value = loadScene.progress;
}
else
{
timer += Time.unscaledDeltaTime;
LoadingBar.value = Mathf.Lerp(0.9f, 1f, timer);
if (LoadingBar.value >= 1f)
{
loadScene.allowSceneActivation = true;
yield break;
}
}
}
}
}
'Unity' 카테고리의 다른 글
유니티 머티리얼 Emission 활성화, 비활성화 (0) | 2024.02.26 |
---|---|
유니티 스크립트가 부착이 안될경우 (0) | 2024.02.26 |
유니티 싱글톤 베이스 (0) | 2024.02.21 |
Unity 깃 허브 LFS 오류 (0) | 2024.02.21 |
Unity 머티리얼 옵션 (1) | 2024.02.12 |