로딩은 앱/게임에서 흔히 볼 수 있는데 씬로딩은 단순히 로딩되는 걸 보여주는 것보단 다른 중요한 이유가 존재한다.
이 기능의 씬 로딩은 비동기(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함수 속 코드를 사용하면 된다.
출처 :
'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 |