【Unity】動画を再生しながらシーンを非同期でロードする

投稿者: | 2021-04-24

シーンのロード中に動画を再生して、動画が終了したら読み込んでシーンへ遷移できるようにしてみます。

まず、VideoPlayerオブジェクトにスクリプトをつけました。SourceをVideo Clipにして、Video Clipにスクリプトで動画を設定します。動画はスクリプトにアタッチしています。

Render Modeをkamera Near Planeにすると、シーンのカメラに動画が表示されます。カメラはその下にCameraにアタッチしています。

Audio Output Modeにオーディオソースをアタッチすると、動画の音声をオーディオソースから出力することもできます。

スクリプトでは、スタート時に動画の再生とシーンの非同期読み込みを開始します。

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

public class MovieTest1 : MonoBehaviour
{
    VideoPlayer videoPlayer;
    AsyncOperation asyncOperation;
    [SerializeField] VideoClip videoClip;
    [SerializeField] Text text;

    // Start is called before the first frame update
    void Start()
    {
        // ビデオプレイヤーを取得
        videoPlayer = GetComponent<VideoPlayer>();

        // ビデオクリップを設定
        videoPlayer.clip = videoClip;
        
        // ループ再生をオン
        videoPlayer.isLooping = true;

        // すぐに再生を始める
        videoPlayer.playOnAwake = true;

        // 最後まで再生したときの処理を追加
        videoPlayer.loopPointReached += FinishPlayingVideo;

        // 3秒後にシーンの読み込みを開始
        Invoke("StartLoadScene", 3f);
    }

    void StartLoadScene()
    {
        StartCoroutine("LoadScene");
    }

    IEnumerator LoadScene()
    {

        asyncOperation = SceneManager.LoadSceneAsync(SceneManager.GetActiveScene().name);

        asyncOperation.allowSceneActivation = false;

        while (!asyncOperation.isDone)
        {
            // 進行度をテキストに表示
            text.text = "読み込み中: " + (asyncOperation.progress * 100) + "%";

            // シーンの読み込みが終わった後の処理
            if (asyncOperation.progress >= 0.9f)
            {
                text.text = "読み込み中: 100%";
            }

            yield return null;
        }
    }

    // 動画が終わったときの処理
    void FinishPlayingVideo(VideoPlayer vp)
    {
        // 再生を停止
        videoPlayer.Stop();

        // シーンを遷移
        asyncOperation.allowSceneActivation = true;

    }
}

AsyncOperation.allowSceneActivationにtrueを入れると、読み込んだシーンがすぐにアクティブになります。なのでまずはfalseを入れておいて、動画の再生が終わったらtrueにします。

動画が終わったときのメソッドは、VideoPlayer.loopPointReachedに加算代入します。このメソッドのなかでAsyncOperation.allowSceneActivationにtrueを入れています。

VideoPlayer.loopPointReachedを使うために動画をループ再生する必要があります。

PexelsRyutaro Tsukataによる動画

コメントを残す

メールアドレスが公開されることはありません。