유니티3D 로딩씬 만들기 (2023.10.02)

최장범·2023년 10월 2일
0

TIL

목록 보기
37/50

서설

  • 우리가 게임을 하다보면 씬과 씬을 넘어가는데에는 항상 로딩창이 우리의 기다림을 함께합니다. 시간이 지남에 따라 채워지는 로딩바가 하고싶은 게임을 하기전 설렘을 더욱 증폭시키기도 합니다. 오늘은 이런 로딩바를 현재하고 있는 팀 프로젝트에 추가해보겠습니다.

유니티 세팅

  1. UI >> Image 를 만듭니다.
  • 배경이 될 image이기 때문에 원하는 색으로 설정 뒤에 화면을 채워줍니다.
  1. Image 2개를 더 추가합니다. 두개의 image는 로딩바와 로딩바의 프레임이 됩니다.

  2. 두 이미지 파일에 준비해둔 이미지 어셋을 넣어줍니다. 그리고 image component에서 Set Native Size를 눌러줍니다.

  3. 로딩바 이미지를 누르고,
    -Image component에서 Image Type을 Filled로 바꿉니다.
    -아래의 Fill Method를 Horizontal로 바꿉니다.
    -Fill Amount를 0으로 바꿉니다.

  4. 아래의 LoadingBar 스크립트를 Canvas에 추가 하고 로딩바 이미지를 할당합니다.

  5. 미리 준비한 GameStartScene과 SampleScene을 이용해 로딩창이 제대로 실행되는지 시험해봅니다.

  • GameStart 스크립트를 이용합니다.
  • GameStartScene에 gameobject를 만들고 SceneLoad라고 명명합니다.
    -SceneLoad에 GameStart 스크립트를 넣어줍니다.
  1. File >> Build Settings를 누르고 GameStartScene,SampleScene,LoadingScene을 추가해줍니다.

  2. 잘 실행되는지 테스트를 해보면 끝!


스크립트

  • LoadingBar 스크립트를 만듭니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class LoadingBar : MonoBehaviour
{
    public static string nextScene;

    [SerializeField] Image progressBar;

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(LoadScene());
    }

    public static void LoadScene(string sceneName)
    {
        nextScene = sceneName;
        SceneManager.LoadScene("LoadingScene");
    }
    IEnumerator LoadScene()
    {
        yield return null;
        AsyncOperation op = SceneManager.LoadSceneAsync(nextScene);
        op.allowSceneActivation = false;
        float timer = 0.0f;
        while (!op.isDone)
        {
            yield return null;
            timer += Time.deltaTime;
            if (op.progress < 0.9f)
            {
                progressBar.fillAmount = Mathf.Lerp(progressBar.fillAmount, op.progress, timer);
                if (progressBar.fillAmount >= op.progress)
                {
                    timer = 0f;
                }
            }
            else
            {
                progressBar.fillAmount = Mathf.Lerp(progressBar.fillAmount, 1f, timer);
                if (progressBar.fillAmount == 1.0f)
                {
                    op.allowSceneActivation = true;
                    yield break;
                }
            }
        }

    }
}
  • 씬을 넘겨줄 GameStart 스크립트를 만듭니다.(스크립트 이름은 알아서)
    -화면을 누르면 씬을 넘기는 기능을 구현합니다.
    -본인의 경우, 게임시작씬에서 샘플씬으로 넘어 가야하기 때문에 "SampleScene"을 적어줍니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class GameStart : MonoBehaviour
{
    

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            LoadingBar.LoadScene("SampleScene");
        }
    }
}

한 줄 생각

  • 주어진 시간이 짧지만 그 안에 많은것들을 구현하려고 노력하고 좀 더 수익성 있는 게임들의 모습들을 생각하며 하나하나 게임의 요소들을 추가해가는 시간들이 본인에게 정말 큰 자양분이 된다는 것을 다시한번 느낀다.

0개의 댓글