[Unity] 複数のSceneのCameraからの映像1つのRenderTextureに表示する

題名の通り。
前回は1つのシーン内で全レイヤーのデータを作っていたのですが、
それだと映像を作るのがしんどいので、シーンを複数に分けてつくって
それをまとめてロードして表示するようにしてみました。

 

シーン構成はこんな感じ。
MainがRenderTextureを表示する最終的に使用するシーン。
AとBがRenderTextureに入れるための映像を作るシーンになります。

AとBのシーンのMainCameraがRenderTextureへの書き出し用カメラ。
ただ、それだけだとGAMEビューでカメラから見た絵の確認が出来なかったので
チェック用にMainCameraと別にViewカメラをつくって配置しています。
(MainCamera = ViewCamera の状態)

まずは複数シーンを同時に操作したりロードしたりするときの挙動確認。

Unityは、ヒエラルキ上に複数のシーンを開くことができて、この状態だと
開かれているシーンが同じGameの空間内に同時に再生される状態になります。

この段階でまず困ったのが、複数のシーンがロードされている場合はどのカメラがGameCameraとして使用されるのかが全く分からない。

スクリプトで使っていないシーンのカメラはOffればいいのか?
と思ったのですが、シーンに含まれるカメラを取得してOffる方法がわからずうーん…

GetComponentとかFindで持ってこれるのは、Scriptがアタッチされているシーンの情報のみ…

と、しばらくスクリプトからのアプローチを考えていたのですが

CameraのDepth値が小さい順に描画される
ClearFlagsに応じて、描画のリセット方法が変わる

という事らしいです。
※ 複数在る場合は全部描画されているとあとで気がつきました ※

今回は、RenderTextureをセットしたものを重ねるので、描画が重なっていたViewCamera側は
特に無視してもよく、むしろ描画の回数考えるといらないカメラは削除したほうがよいという
話でした。

なるほど。

次に、MainシーンにAとBをロード。

ロードするシーンは、事前にBuildSettingsに入れておく必要があります。
Resourceからは呼べないのね(´・ω・`)

メインシーンに空のGameObjectを作成して、上のスクリプトをアタッチ。
シーンをコントロールしたい場合は、SceneManagement をロードして、
SceneManager.LoadScene(シーン名,読み方)
でロードします。
今回の場合の Additiveは、すでに読み込まれているシーンに対して
複数のシーンをロードするという意味になります。

実行結果はこんな感じ。

Aのシーンがこんな感じ

Bのシーンがこんな感じで

MainにはRenderTextureを貼り付けたCanvasを作成。
AとBのシーンのレンダリング結果がRenderTexture上で重ねられて
CanvasのRawImageに貼り付けられます。

RenderTextureに表示されるのはロードされているオブジェクトのみになるので
RenderTextureを設定した別のシーンCを用意しておいても
ロードさえしなければ読み込まれず、スクリプト側でロードした場合は
Depthの値を使用した順序でRenderTextureに表示されます。

シーンとプレハブの関係性というか、どっちでなにをするのが良いのかがイマイチ分からず
Unityの構造もまだまだわからん事が多いので引き続き検証!!

参考

コメントを残す

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

*