【Unity】オブジェクトの一部に動画を映す

投稿者: | 2020-12-16

インターホンの画面に動画を流してみました。

まずヒエラルキーでVideoPlayerを作りプレハブ化しました。インスペクタでVideo Clipに再生する動画をアタッチし、Play On AwakeとLoopにチェックを入れ、Render ModeをRender Textureにしました。

これでインスタンスができるとすぐにループ再生されます。また、Target Textureに設定されたレンダーテクスチャに動画が映ります。

進行管理のスクリプトではまずこのVideoPlayerをインスタンス化します。再生するのと同時にインスタンス化するとロードのために遅延が起こるので、前もってインスタンス化しておきました。

Video.VideoPlayerのPrepareメソッドを使うと再生する前にロードしておくこともできます。

  1. [SerializeField] GameObject intercom;
  2. [SerializeField] GameObject intercomVideo;
  3. Texture displayTexture;
  4.  
  5. // 準備
  6. void A(){
  7. // VideoPlayerをインスタンス化する
  8. intercomVideo = Instantiate(/* ... */ );
  9. }
  10.  
  11. // 画面をつける
  12. void B(){
  13. // インターホンの画面部分のマテリアルを取得
  14. Material mat = intercom.GetComponent<MeshRenderer>().materials[1];
  15.  
  16. // 画面のテクスチャを保存
  17. displayTexture = mat.GetTexture("_BaseColorMap");
  18.  
  19. // レンダーテクスチャを新規作成
  20. RenderTexture ren = new RenderTexture(256, 256, 16, RenderTextureFormat.ARGB32);
  21.  
  22. // VideoPlayerにレンダーテクスチャをセット
  23. intercomVideo.GetComponent<UnityEngine.Video.VideoPlayer>().targetTexture = ren;
  24.  
  25. // 画面のマテリアルにレンダーテクスチャをセット
  26. mat.SetTexture("_BaseColorMap", ren);
  27. }
  28.  
  29. // 画面を消す
  30. void C()
  31. {
  32. // インターホンの画面部分のマテリアルを取得
  33. Material mat = intercom.GetComponent<MeshRenderer>().materials[1];
  34.  
  35. // 画面のテクスチャをもとに戻す
  36. mat.SetTexture("_BaseColorMap", displayTexture);
  37.  
  38. // VideoPlayerオブジェクトを破壊
  39. Destroy(intercomVideo);
  40. }

インターホンは画面部分とそれ以外とでマテリアルが別れているので、映像を流すときは、画面部分のマテリアルを取得して、今のテクスチャを変数に入れておき、消すときにそれをセットします。

そして、new演算子でレンダーテクスチャのインスタンスを作り、VideoPlayerコンポーネントのtargetTextureと画面のマテリアルのアルベドマップにセットします。するとインターホンの画面に映像が流れます。

消すときは元のテクスチャをセットします。VideoPlayerオブジェクトの破壊もしました。

コメントを残す

メールアドレスが公開されることはありません。