오늘은 Unity에서 씬 전환 없이 동일한 씬 내에서 로딩 화면을 구현하는 방법을 정리했다.
게임을 하다 보면 씬을 바꾸지 않고 내부에서 데이터나 오브젝트를 비동기로 로드해야 할 때가 있는데, 이때 사용자에게 로딩 중이라는 표시를 해주는 게 UX적으로 중요하다.
예를 들어, 맵 생성, 데이터 로딩, 캐릭터 초기화 등 시간 걸리는 작업이 있을 때 바로 적용 가능하다.
씬을 전환하지 않고, 같은 씬 안에 로딩용 Canvas를 띄운다.
화면을 살짝 어둡게 하기 위해 검은 배경 이미지 + 알파값 0.5 정도로 처리.
Image.fillAmount를 활용해서 로딩바처럼 표현.
실제 로딩은 Coroutine으로 진행하면서 진행도 UI를 업데이트.
로딩용 Canvas는 평소에는 꺼져 있다가 (SetActive(false)),
로딩이 시작되면 SetActive(true)로 보이게 만든다.
Image의 fillAmount로 로딩 퍼센트를 시각적으로 표현.
Coroutine을 통해 progress를 천천히 올리면서 로딩 연출을 구현.
public class LocalLoader : MonoBehaviour
{
public GameObject loadingCanvas;
public Image fillImage;
public Text progressText;
public void StartLoading()
{
StartCoroutine(LoadDataCoroutine());
}
IEnumerator LoadDataCoroutine()
{
loadingCanvas.SetActive(true);
float progress = 0f;
while (progress < 1f)
{
progress += Time.deltaTime * 0.5f; // 로딩 시간: 약 2초
fillImage.fillAmount = progress;
progressText.text = $"{(progress * 100f):F0}%";
yield return null;
}
yield return new WaitForSeconds(0.5f);
loadingCanvas.SetActive(false);
}
}
fillAmount는 0 ~ 1 사이 값을 가지므로 퍼센트 계산도 간단하다.
Coroutine으로 시간에 따라 로딩 연출을 구현할 수 있다.
실제 리소스를 로드하거나 생성하는 타이밍에도 활용 가능하다.
Unity에서 꼭 씬을 전환하지 않더라도 로딩 화면처럼 연출할 수 있다는 걸 알게 됐다.
앞으로는 데이터를 비동기로 처리할 때 이런 식으로 사용자에게 기다리는 시간을 명확하게 보여줄 수 있도록 UI를 더 다듬어야겠다.
