前回、🔍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()でコルーチンを実行しているだけです。
要約すると、初回実行時に連続再生に必要なプロパティを設定し、準備中/再生中のステータスをコルーチンで監視する処理になっています。
動画周りの基本的な処理はこれで問題ないと思います。