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

投稿者: | 2020-12-16

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

まずヒエラルキーで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オブジェクトの破壊もしました。

コメントを残す

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