インターホンの画面に動画を流してみました。
まずヒエラルキーでVideoPlayerを作りプレハブ化しました。インスペクタでVideo Clipに再生する動画をアタッチし、Play On AwakeとLoopにチェックを入れ、Render ModeをRender Textureにしました。
これでインスタンスができるとすぐにループ再生されます。また、Target Textureに設定されたレンダーテクスチャに動画が映ります。
進行管理のスクリプトではまずこのVideoPlayerをインスタンス化します。再生するのと同時にインスタンス化するとロードのために遅延が起こるので、前もってインスタンス化しておきました。
Video.VideoPlayerのPrepareメソッドを使うと再生する前にロードしておくこともできます。
[SerializeField] GameObject intercom;
[SerializeField] GameObject intercomVideo;
Texture displayTexture;
// 準備
void A(){
// VideoPlayerをインスタンス化する
intercomVideo = Instantiate(/* ... */ );
}
// 画面をつける
void B(){
// インターホンの画面部分のマテリアルを取得
Material mat = intercom.GetComponent<MeshRenderer>().materials[1];
// 画面のテクスチャを保存
displayTexture = mat.GetTexture("_BaseColorMap");
// レンダーテクスチャを新規作成
RenderTexture ren = new RenderTexture(256, 256, 16, RenderTextureFormat.ARGB32);
// VideoPlayerにレンダーテクスチャをセット
intercomVideo.GetComponent<UnityEngine.Video.VideoPlayer>().targetTexture = ren;
// 画面のマテリアルにレンダーテクスチャをセット
mat.SetTexture("_BaseColorMap", ren);
}
// 画面を消す
void C()
{
// インターホンの画面部分のマテリアルを取得
Material mat = intercom.GetComponent<MeshRenderer>().materials[1];
// 画面のテクスチャをもとに戻す
mat.SetTexture("_BaseColorMap", displayTexture);
// VideoPlayerオブジェクトを破壊
Destroy(intercomVideo);
}
インターホンは画面部分とそれ以外とでマテリアルが別れているので、映像を流すときは、画面部分のマテリアルを取得して、今のテクスチャを変数に入れておき、消すときにそれをセットします。
そして、new演算子でレンダーテクスチャのインスタンスを作り、VideoPlayerコンポーネントのtargetTextureと画面のマテリアルのアルベドマップにセットします。するとインターホンの画面に映像が流れます。
消すときは元のテクスチャをセットします。VideoPlayerオブジェクトの破壊もしました。