【Unity】スクリプトで動画の再生・停止・連続再生を制御する方法

videoPlayer.png

 前回、🔍VideoPlayerを使って動画を再生する最もカンタンな方法を紹介しましたが、単純にオブジェクトに貼り付けて自動再生するだけのものでした。今回は再生・停止・一時停止・複数の連続再生まで実装してみようと思います。

VideoPlayerのプロパティ

プロパティ説明
Source
動画ファイルを指定するか、動画URLを指定するか
Play On Awake自動で再生するか。OFFだとPlay()コマンドを待つ
Wait For First Frame最初のフレームが準備できるまで待つか
Loopループ再生するか
Skip On Drop実時間に合わせてフレームをスキップするか。OFFだと同期のためにはじめの数フレームが破棄される場合がある
Play back Speed再生速度(1で等速、最大10)
Render Mode
カメラの奥や手前に表示するか、マテリアルのテクスチャとして表示するか
Rendererレンダリング先
Material Property_AlfaTexに貼る必要がある場合のみ設定
Audio Output Modeミュートしたりしなかったり

動画の再生

using UnityEngine.Video;
動画を制御するには必ずこの名前空間を宣言します。
VideoPlayer videoPlayer;
videoPlayer = GameObject.Find("Plane").GetComponent();
videoPlayer.Play();
Play()で再生できます。

動画の停止と一時停止

videoPlayer.Stop();
Stop()で動画の再生を止められます。再度Play()すると最初からになります。
videoPlayer.Pause();
Pause()で一時停止できます。再度Play()すると一時停止したところから再生されます。
    if(!videoPlayer.isPlaying) videoPlayer.Play();  // 動画を再生する
else videoPlayer.Pause(); // 動画を一時停止
isPlayingを使えば動画の再生・一時停止を行うボタンを実装できます。

複数の動画を連続再生

MultiVideo.cs を作成してスクリーンにアタッチします。
public class MultiVideo : MonoBehaviour{
public List videoClipList;
public bool loop;
[HideInInspector] private List videoPlayerList;
[HideInInspector] private int videoIndex = 0;

void Start(){
StartCoroutine(playVideo()); // コルーチン実行
}

IEnumerator playVideo(bool firstRun = true){ // コルーチン宣言
int listLen = videoClipList.Count;
if(videoClipList == null || listLen <= 0){
Debug.LogError("Assign VideoClips from the Editor");
yield break;
}

if(loop) // ループの処理
videoIndex %= listLen;
else{ // 全再生完了で終了
if(videoIndex>=listLen) yield break;
}

if(firstRun){ // 初回実行処理
videoPlayerList = new List();
for(int i = 0; i < listLen; i++){
GameObject vidHolder = new GameObject("video" + i);
vidHolder.transform.SetParent(transform);
VideoPlayer videoPlayer = vidHolder.AddComponent();
videoPlayerList.Add(videoPlayer);
// ビデオの各種プロパティを設定
videoPlayer.playOnAwake = false;
videoPlayer.source = VideoSource.VideoClip;
videoPlayer.clip = videoClipList[i];
videoPlayer.isLooping = false;
videoPlayer.renderMode = VideoRenderMode.MaterialOverride;
videoPlayer.targetMaterialRenderer = GetComponent();
videoPlayer.audioOutputMode = VideoAudioOutputMode.Direct;
}
}

videoPlayerList[videoIndex].Prepare();
while(!videoPlayerList[videoIndex].isPrepared)
yield return null; // 準備中はここで中断

videoPlayerList[videoIndex].Play(); // 動画を再生

while(videoPlayerList[videoIndex].isPlaying)
yield return null; // 再生中はここで中断

videoPlayerList[videoIndex].Stop();
videoIndex++;

StartCoroutine(playVideo(false));
}
}
長く見えますが、Start()でコルーチンを実行しているだけです。
要約すると、初回実行時に連続再生に必要なプロパティを設定し、準備中/再生中のステータスをコルーチンで監視する処理になっています。


動画周りの基本的な処理はこれで問題ないと思います。