ゲームのイベントをクリアすると途中でムービーが流れる事はよくありますね、今回はそういったムービーをUnityで再生する事が出来るようにします。
WindowsのUnityに動画をインポートするにはAppleのQuickTimeがパソコンにインストールされている必要があります。
インストールされていない方はインストールするようにしてください。
ただしWindows版のQuickTimeはサポートが終了しているようです。
ブラウザを介した動画の再生に利用する点では脆弱性が発生するようなので気を付けてください。
今回の場合Unityにインポートする際にQuickTimeを使用しているだけで再生とは関係ないんでしょうか?
とりあえず動画をUnityに取り込んだ後QuickTimeをアンインストールしてもUnity内で再生出来たのでやはり取り込み時にだけ使っているようです。
再生出来る動画のファイル形式等詳しい事は
を参照してください。
Unity5.6以降のバージョンの方はVideo Playerを使ってください。

MovieTextureは使えなくなります。
動画ファイルをUnityにインポートする
まずは動画ファイルをUnityにインポートします。
環境によってはQuickTimeで再生出来るファイル形式でもインポートに失敗します。
わたくしの場合MP4が取りこめたのでMP4にしてUnityに取り込みました。
ProjectタブのAssetsフォルダで右クリック→Import NewAssetsを選択し動画ファイルを選びます。
↑のように動画の中にオーディオクリップがある形のファイルになります。
それぞれの動画のクオリティを1にしてクオリティを上げておきます。
動画を再生させる
動画を貼り付ける場所を3D Objectで作成したPlaneとUIのRawImageに貼り付ける2つの方法で動画を再生してみます。
3D ObjectのPlaneで再生
ヒエラルキーに右クリック→3D Object→Planeを選択しカメラに映るように回転させます。
PlaneにMovieTestというスクリプトを作り取りつけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | using UnityEngine; using System.Collections; using UnityEngine.UI; public class MovieTest : MonoBehaviour { enum Mode { Plane, RawImage }; // PlaneとRawImageで切り替える [SerializeField] private Mode mode; // 再生する動画 [SerializeField] private MovieTexture[] movies; // 動画番号 private int num; void Start () { // 最初の動画を設定 num = 0; if(mode == Mode.Plane) { GetComponent<MeshRenderer>().material.mainTexture = movies[num]; } else { GetComponent<RawImage>().texture = movies[num]; } // 動画をループ設定 movies[num].loop = true; } void Update () { // Sキーを押したら動画の再生とポーズを繰り返す if(Input.GetKeyDown("s")) { if(movies[num].isPlaying) { movies[num].Pause(); Debug.Log("pause"); } else { movies[num].Play(); Debug.Log("start"); } // Qキーを押したら動画をストップ } else if(Input.GetKeyDown("q")) { movies[num].Stop(); Debug.Log("stop"); } else if(Input.GetKeyDown("n")) { // 動画を切り替える前に今再生している動画を止める movies[num].Stop(); // 次の動画を指す num++; if(num >= movies.Length) { num = 0; } // Textureを次のMovieTextureに変える if(mode == Mode.Plane) { GetComponent<MeshRenderer>().material.mainTexture = movies[num]; } else { GetComponent<RawImage>().texture = movies[num]; } // 動画をループに設定 movies[num].loop = true; Debug.Log("change movie"); } } } |
再生する動画はMovieTextureとして扱います。
Unity5.3.4f1だと動画のImportSettingsに再生のオプションが表示されないのでスクリプトで設定しています・・・(^_^;)
再生する動画をインスペクタで設定出来るようにしSキーで再生とポーズ、Qキーで停止を行います。
またNキーを押した時に次の動画に切り替えています。
今回はPlaneなのでMeshRendererのMaterialのMainTextureにMovieTextureを設定しています。
MovieTextureはTextureと同じ扱いが出来るので、スクリプトで設定せず、AssetsフォルダにMaterialを作成しAlbedoにインポートした動画を設定し、
そのマテリアルをMeshRendererのMaterialsに設定し使用する事が出来ます。
Planeのインスペクタで設定をし動画を再生してみましょう。
↑のようにMovieTestでModeをPlaneにし、Moviesに動画を2本ドラッグ&ドロップします。
それでは実行してみましょう。
↑のように最初の動画がSキーで再生されもう一度Sキーを押すと停止しています。
Nキーを押すと別の動画に切り替わりSキーを押して再生されています。
UIのRawImageで動画を再生
次はUIのRawImageで動画を再生してみましょう。
使用するスクリプトは同じなのでModeをRawImageに変更します。
次はヒエラルキーで右クリック→UI→RawImageを選択します。
MoveTestスクリプトを取りつけ↑のようにインスペクタの設定をします。
同じようにUnityを実行し確認してみてください。
実行結果はほぼ同じなのでサンプル動画は載せません。
動画の音声を再生する
実はここまでで動画の再生は出来ましたが音声が再生されていませんでした。
音声はAudioSourceコンポーネントを取りつけ、動画をインポートした時に一緒に付いてきた音声ファイルをAudioClipに設定する必要があるようです。
RawImageにAudioSourceコンポーネントを取りつけそこに音声ファイルをドラッグ&ドロップしてください。
またMovieTestスクリプトを修正します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | using UnityEngine; using System.Collections; using UnityEngine.UI; public class MovieTest : MonoBehaviour { enum Mode { Plane, RawImage }; // PlaneとRawImageで切り替える [SerializeField] private Mode mode; // 再生する動画 [SerializeField] private MovieTexture[] movies; // 音声再生コンポーネント private AudioSource audioSource; // 再生する音声 [SerializeField] private AudioClip[] audioClip; // 動画番号 private int num; void Start () { // 最初の動画を設定 num = 0; if(mode == Mode.Plane) { GetComponent<MeshRenderer>().material.mainTexture = movies[num]; } else { GetComponent<RawImage>().texture = movies[num]; } audioSource = GetComponent<AudioSource>(); audioSource.clip = audioClip[num]; // 動画をループ設定 movies[num].loop = true; } void Update () { // Sキーを押したら動画の再生とポーズを繰り返す if(Input.GetKeyDown("s")) { if(movies[num].isPlaying) { movies[num].Pause(); audioSource.Pause(); Debug.Log("pause"); } else { movies[num].Play(); audioSource.Play(); Debug.Log("start"); } // Qキーを押したら動画をストップ } else if(Input.GetKeyDown("q")) { movies[num].Stop(); audioSource.Stop(); Debug.Log("stop"); } else if(Input.GetKeyDown("n")) { // 動画を切り替える前に今再生している動画を止める movies[num].Stop(); audioSource.Stop(); // 次の動画を指す num++; if(num >= movies.Length) { num = 0; } // Textureを次のMovieTextureに変える if(mode == Mode.Plane) { GetComponent<MeshRenderer>().material.mainTexture = movies[num]; } else { GetComponent<RawImage>().texture = movies[num]; } // 動画をループに設定 movies[num].loop = true; // 再生音声を変更 audioSource.clip = audioClip[num]; Debug.Log("change movie"); } } } |
インスペクタで音声ファイルを設定出来るようにし、動画の再生と合わせて音声も再生したり止めたりしています。
audioSource.Pause()
という記述がありますが、動画がPauseされるといっしょに音声が止まってるようなのであえて記述しなくていいのかも?
そればかりじゃなくAudio SourceコンポーネントのPitchを遅くすると動画も遅くなります。
動画に内包される形で音声ファイルがあるのでこういう風になるんでしょうか?
↑のようにMovieTestスクリプトのインスペクタに動画の音声ファイルをドラッグ&ドロップします。
動画の再生と合わせて音声が鳴ると思います。
音声をどこで手に入れたものかちょっと忘れたので音声付動画は載せるのは控えます・・・・(^_^;)
終わりに
今回の動画の再生はスタンドアロン形式の動画の再生に関してのもので、スマフォで動画を再生する場合は特殊フォルダStreamingAssetsに動画を置いてそれを利用しなければいけないようです。
またAndroid形式はMovieTexture形式自体がサポートされていないようです。
詳しくは
に載っています。
スマフォ持ってないから確認出来ません・・・ごめんなさい(-_-)