[Unity]uGUI上で動画を再生する


# 環境
下記の環境を使用しています。

0. Unity 5.4.1
0. C#
0. Windowsアプリ向け

# 1.動画をインポートする

　Unity上で動画を再生するには**MovieTexture**として読み込む必要があるのでその準備です。詳しくは[公式ドキュメント](https://docs.unity3d.com/ja/current/Manual/class-MovieTexture.html)に載っていますが、Unityの内部でQuickTimeを使用して**Ogg Theora 形式(.ogv)**に変換しているようです。
　その為、QuickTimeがインストールされていない環境（主にWindows)の場合には
> [MovieTextureの具体的な使い方](http://qiita.com/nakfiv/items/ce7c5506c66280014709)

こちらの記事を参考にffmpegを使用して変換してやります。

動画ファイルの準備が出来たら、今回は**Resources.Load()**を使用して動画ファイルを読み込みたいので**[Assets/Resources/]**の中に入れます。

# 2.コード

```MovieOnUI.cs
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

[RequireComponent(typeof(RawImage))]
[RequireComponent(typeof(AudioSource))]
public class MovieOnUI : MonoBehaviour
{

    [SerializeField] string m_moviePath;

    MovieTexture m_movieTexture = null;

    RawImage m_rawImage = null;
    AudioSource m_audioSource = null;

    public bool IsPlaying
    {
        get { return m_movieTexture != null && m_movieTexture.isPlaying; }
    }

    public void Play()
    {
        if (IsPlaying)
        {
            Stop();
        }

        m_movieTexture = (MovieTexture)Resources.Load<MovieTexture>(m_moviePath);

        if (m_movieTexture == null)
        {
            Debug.LogError("movie is nothing:" + m_moviePath);
            return;
        }

        m_movieTexture.loop = false;

        m_rawImage.material.mainTexture = m_movieTexture;
        m_audioSource.clip = m_movieTexture.audioClip;

        m_movieTexture.Play();
        m_audioSource.Play();
    }

    public void Stop()
    {
        if (!IsPlaying)
        {
            return;
        }

        m_movieTexture.Stop();
        m_audioSource.Stop();
    }

    void Start()
    {
        m_rawImage = this.GetComponent<RawImage>();
        m_audioSource = this.GetComponent<AudioSource>();

        Play(); // テスト用
    }

    void Update()
    {
        if (m_movieTexture != null && !m_movieTexture.isPlaying)
        {
            m_movieTexture = null;
        }
    }
}
```
基本的に**Play()**を呼べば動画が再生されます。
今回はテスト用に**Start()**の中に書いてますが実際に使う場合は消しても良いと思います。

# 使い方

0. ヒエラルキーを右クリックし[UI > Canvas]でCanvasオブジェクトを作る。
0. Canvasを右クリックし[UI > RawImage]でRawImageオブジェクトを作る。
0. RawImageにMovieOnUIを追加
0. **MoviePath**に動画ファイルのパスを入力(拡張子は不要です)

　後はいつものUIを調整する感じで再生したい所に出るようにしてやれば再生出来ます。
今回は16:9のウィンドウ想定で画面一杯に再生したかったので下図のような感じにしました。（隙間が出来る事があるきがしているので念のため上下左右1ずつ余分に出るようにしてます。）

 ![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/141550/5b5c3fc5-c342-a917-7916-e7e658774ce8.png) ![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/141550/29a96005-756e-2710-20dd-aeee52af3ccc.png)

　この設定で画面の比率が変わっても上下に余白が出来るので余白を黒くするようにしておけば下図の状態になって何かそれっぽくなります。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/141550/8dc51779-1b5d-60aa-99d0-f6fde295b270.png)

![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/141550/41f1c627-cc12-dea0-d32d-d22f839eafc8.png)

# 備考
　今回はWindows用のゲームを想定して作っていたのでこんな感じです。[公式ドキュメント](https://docs.unity3d.com/ja/current/Manual/class-MovieTexture.html)にも書いてありますが、
**iOS,Android**ではMovieTextureをサポートしておらず**Handheld.PlayFullScreenMovie**を使用してフルスクリーンストリーミング再生をするようです。また、**StreamingAssets フォルダー内にビデオを格納する必要**があったり、サポートされている動画形式も異なるようなのでそれぞれのアプリとしてビルドする前に一度確認しておいたほうが良さそうです。