카테고리 없음

[Unity] 씬 전환 로딩 화면 구현 (LoadingSceneController)

danpat77 2025. 4. 25. 20:33

게임에서 씬이 전환될 때, 사용자에게 아무런 안내 없이 정적 화면이 뜨면 어색하게 느껴질 수 있습니다.

이번 글에서는 그런 어색함을 줄이고, 부드러운 씬 전환을 만들기 위한 로딩 UI 시스템을 직접 구현해봤습니다.

페이드 인/아웃, 로딩바, 그리고 '로딩중...' 애니메이션까지 포함되어 있어 바로 활용하기 좋습니다.


구현 목표 및 개요

  • 씬 전환할 때 로딩 화면을 보여줍니다.
  • 검은 화면이 서서히 나타나면서 페이드 인/아웃 효과를 줍니다.
  • 로딩 진행도를 보여주는 로딩 바를 표시합니다.
  • '로딩중...' 텍스트에 점이 하나씩 추가되는 애니메이션을 적용합니다.
  • 외부에서 로딩 완료 후 추가 동작을 지정할 수 있도록 콜백 기능을 지원합니다.

코드 설명 (파트별 분리)

1. 변수 선언 및 초기화

[SerializeField] private CanvasGroup canvasGroup;
[SerializeField] private Image loadingBar;
[SerializeField] private TextMeshProUGUI loadingText;
[SerializeField] private TextMeshProUGUI tipText;

private string loadSceneName;
private Action onSceneLoadedAction;
  • CanvasGroup을 통해 페이드 효과를 구현합니다.
  • loadingBar는 진행도를 보여주는 이미지입니다.
  • loadingText는 '로딩중...' 메시지를 담당합니다.
  • onSceneLoadedAction은 로딩 완료 후 실행될 외부 콜백입니다.

2. 시작 시 비활성화 처리

private void Start()
{
    gameObject.SetActive(false);
}
  • 씬 시작 시 로딩 오브젝트를 꺼둡니다.

3. 외부 호출용 메서드

public void LoadScene(string sceneName, Action onSceneLoaded = null)
  • 씬 이름과 콜백을 받아 로딩을 시작하는 공개 함수입니다.
  • 내부에서 코루틴을 실행하고, 씬 이름을 저장합니다.

4. 메인 로딩 프로세스

private IEnumerator LoadSceneProcess()
  • 실제로 씬을 비동기 로드하고, 로딩바를 업데이트하는 핵심 함수입니다.
  • 진행률(op.progress)을 이용해 로딩바를 채우고,
  • 마지막 10%는 Mathf.Lerp로 부드럽게 마무리합니다.
  • 동시에 "로딩중..." 애니메이션도 같이 처리됩니다.

5. 씬 로딩 완료 이벤트 처리

private void OnSceneLoaded(Scene arg0, LoadSceneMode arg1)
  • 지정된 씬이 완료되면 호출되는 콜백 함수입니다.
  • 오브젝트 풀 정리, 콜백 실행, 페이드 아웃을 담당합니다.

6. 페이드 인/아웃 처리

private IEnumerator Fade(bool isFadeIn)
  • CanvasGroup.alpha를 조절해 페이드 인/아웃을 구현합니다.
  • 화면 전환 시 부드러운 연출을 위한 핵심입니다.

핵심 포인트 정리

  • 페이드 처리 : CanvasGroupalpha를 조정해서 부드러운 화면 전환을 구현했습니다.
  • 로딩 진행도 : SceneManager.LoadSceneAsync()를 사용해서 실제 로딩 진행도에 맞춰 로딩바를 채워줬습니다.
  • '로딩중...' 애니메이션 : 점(.)의 수를 0.5초마다 하나씩 추가해서 단순하면서도 동적인 느낌을 주었습니다.
  • 콜백 처리 : Action을 넘겨 받아 로딩 후 추가 작업이 가능하게 만들었습니다.

마치며

이번에 만들어본 LoadingSceneController는 실제 게임 프로젝트에서 바로 사용할 수 있을 정도로 간단하면서도 깔끔하게 동작합니다.

다음에는 여기서 더 발전시켜서, 로딩 중 랜덤 팁 표시나, 특정 상황에서 스킵 버튼 제공 같은 것도 추가할 계획 입니다.