1.概要
今回はnGUI上で動画再生するにはどうしたらいいか?
これをやってみようと思います。
nGUI上なので【Canvas】を用意し、その子供に【RawImage】を用意します。
動画再生には【VideoPlayer】を使用し
【RenderTexture】を使って描画します。
開発環境:Unity 2018.3.8f1 (64-bit)
開発言語:C#
2.準備
まずはプロジェクトを作成します。
Hierarchyに
【Canvas】と【RawImage】を作成します。
【Canvas】は名前そのままで
【RawImage】はvideoBaseという名前に変更しました。
動画再生はスクリプトから行うつもりなので
videoScriptというファイルを用意しておきます。
とりあえず下準備はこれで完了です。
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.結果
結果は下記のとおりです。
無事動作しました。