シーンのロード中に動画を再生して、動画が終了したら読み込んでシーンへ遷移できるようにしてみます。
まず、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を使うために動画をループ再生する必要があります。