簡単なローディング画面(読み込み中)の作成【Unityゲーム制作】

Unityでシーンを切り替える時、「移動先のシーンを読み込み」、「読み込みが終わるまでローディング画面」を出してみます。

進捗バーを表示して、どこまで読み込んでいるのかも表現してみます。

はじめに

「Unity 2020.3.26f1」ヴァージョンで作成しています。

簡単な「進捗バー付きのローディング画面」を作成していきます。

実装開始

実装は「画面作成」→「スクリプト作成」→「調整」の順番でしていきます。

画面を作成

まずは「ローディング画面(遷移前の画面)」を作成していきます。

「UI」→「Button」を追加、ボタンをクリックするとシーンを移動するようにします。

位置とサイズを調整

「UI」→「Panel」を追加。このパネルが読み込み中の画面になります。

まずはパネルの背景を真っ黒にします。

「UI」→「Slider」を追加。これが進捗バーになります。

スライダーの色を適当に設定します。今回は青色で。

「UI」→「Text」を追加。テキスト文言を変更し、位置を調整します。

スライダーのサイズを変更。

Handleのサイズを0に。色をSliderと合わせます。

下記がPanel有効時の画面イメージです。

SliderのValueを動かすと進捗バーが埋まります。1の時に全部埋まればOK。埋まらない場合はFillAreaで調整。

スクリプトの作成

次にスクリプトでSliderのValueを動かします。下記スクリプトを作成。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class LoadingScene : MonoBehaviour
{
    [SerializeField] private GameObject _loadingUI;
    [SerializeField] private Slider _slider;

    public void LoadNextScene()
    {
        _loadingUI.SetActive(true);
        StartCoroutine(LoadScene());
    }

    IEnumerator LoadScene()
    {
        AsyncOperation async = SceneManager.LoadSceneAsync("MainScene");

        while (!async.isDone)
        {
            _slider.value = async.progress;
            yield return null;
        }
    }
}

AsyncOperationのprogressでシーンの読み込み進捗状況の取得ができます。

空のオブジェクトを追加して、SceneManagerに名前を変更。スクリプトをアタッチして変数をセットします。

初期ではPanelを無効にしておきます。

あとはビルド設定で移動先のシーンを追加。

これで実行。「ボタン押下」→「読み込み中画面」→「画面表示」となればOK

調整

実際に動かしてみると、進捗バーが100%になる前に次のシーンに遷移します。

確認するとprogressが0.9でisDoneがfalseになるようです。

            Debug.Log("progress :" + async.progress);

いくつか修正方法がありますが、とりあえずValueを0.9にした時に進捗バーが埋まるようにFillAreaを調整しておきます。

読み込み完了後、自動でシーンを移動するのではなく、キー操作で移動の場合は下記の様な感じのスクリプト。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class LoadingScene : MonoBehaviour
{
    [SerializeField] private GameObject _loadingUI;
    [SerializeField] private Slider _slider;
    [SerializeField] private Text _text;

    public void LoadNextScene()
    {
        _loadingUI.SetActive(true);
        StartCoroutine(LoadScene());
    }

    IEnumerator LoadScene()
    {
        yield return null;

        AsyncOperation async = SceneManager.LoadSceneAsync("MainScene");
        async.allowSceneActivation = false;
        while (!async.isDone)
        {
            _slider.value = async.progress;
            if (async.progress >= 0.9f)
            {
                _text.text = "読み込み完了";
                if (Input.GetKeyDown(KeyCode.Space))
                    async.allowSceneActivation = true;
            }
            yield return null;
        }
    }
}

遷移先のシーンが軽い場合、読み込み中画面が一瞬しか表示されないので進捗バーではなく、アニメーションでクルクル回しても良いのかも。

逆に読み込みが長いシーンでクルクル表示していると、動いてるのか不安になりますわな。

タイトルとURLをコピーしました