中堅プログラマーの備忘録

忘れっぽくなってきたので備忘録として・・・

【Unity】nGUI上でVideoPlayerを使って動画を再生する

1.概要

今回はnGUI上で動画再生するにはどうしたらいいか?
これをやってみようと思います。
nGUI上なので【Canvas】を用意し、その子供に【RawImage】を用意します。
動画再生には【VideoPlayer】を使用し
【RenderTexture】を使って描画します。

開発環境:Unity 2018.3.8f1 (64-bit)
開発言語:C#

2.準備

まずはプロジェクトを作成します。
Hierarchyに
【Canvas】と【RawImage】を作成します。
【Canvas】は名前そのままで
【RawImage】はvideoBaseという名前に変更しました。
動画再生はスクリプトから行うつもりなので
videoScriptというファイルを用意しておきます。

f:id:tsu--kun:20190723152338p:plain

とりあえず下準備はこれで完了です。

3.スクリプト

動画再生についてはスクリプトから行います。
とりあえず起動したらローカルにあるmp4ファイルを
繰り返し再生するだけのスクリプトになっています。

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

public class videoScript : MonoBehaviour
{
    private GameObject obj;
    private RawImage videoBase;
    public VideoPlayer videoPlayer;
    private new GameObject camera;
    // Start is called before the first frame update
    void Start()
    {
        obj = GameObject.Find("videoBase");
        videoBase = obj.GetComponent<RawImage>();

        RenderTexture renderTexture;
        renderTexture = new RenderTexture(960, 540, 0);

        camera = GameObject.Find("Main Camera");

        videoBase.material.mainTexture = renderTexture;

        if (videoPlayer == null) videoPlayer = camera.AddComponent<VideoPlayer>();

        videoPlayer.renderMode = VideoRenderMode.RenderTexture;
        videoPlayer.targetTexture = renderTexture;
        videoPlayer.url = "C:/work/sample.mp4";
        videoPlayer.errorReceived += ErrorReceived;
        videoPlayer.prepareCompleted += PrepareCompleted;
        videoPlayer.Prepare();
        videoPlayer.isLooping = false;
        videoPlayer.aspectRatio = VideoAspectRatio.Stretch;
        videoPlayer.targetCameraAlpha = 1;
        videoPlayer.loopPointReached += EndReached;
    }

    // エラー発生時に呼ばれる
    private void ErrorReceived(VideoPlayer vp, string message)
    {
        Debug.Log("エラー発生");
        vp.errorReceived -= ErrorReceived;
        vp.prepareCompleted -= PrepareCompleted;
        Destroy(videoPlayer);
        vp = null;
    }

    // 動画の読み込みが完了したら呼ばれる
    void PrepareCompleted(VideoPlayer vp)
    {
        vp.prepareCompleted -= PrepareCompleted;
        Debug.Log("ロード完了");
        vp.Play();
    }

    // 動画再生完了時に呼ばれる
    void EndReached(UnityEngine.Video.VideoPlayer vp)
    {
        Debug.Log("再生完了");
        vp.errorReceived -= ErrorReceived;
        Destroy(videoPlayer);
        videoPlayer = null;
        // 動画再生完了時の処理
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

4.結果

結果は下記のとおりです。
無事動作しました。
f:id:tsu--kun:20190723152401p:plain