みなさん、こんにちは!SAT-BOXのツバメです。
今回はUnityで複数のカメラを使って描画する方法のご紹介をしようと思います。
複数のカメラを使えばプレイヤーに追従するUI(プレイヤーネーム等)が物体に隠れてしまう状況を防ぐことが出来ます。
マテリアルのレンダラーキューを調整する方法もありますが、他のオブジェクト等の描画に影響するためレンダラーキューの管理が必要になります。複数のカメラを使用すればすぐに出来てしまいます!
今回はあるオブジェクトが別のオブジェクトに重なっても最前面に表示されるようにしてみます。
1.カメラを2つ用意
まずはエディター上でカメラを2つ用意しましょう。カメラを2つ生成して、名前はわかりやすく[CameraA][CameraB]にしましょう。設定は以下の部分を変えてください。
<CameraA>
Clear Flags -> Skybox
CullingMask -> Defaultのみ
Depth -> 0
<CameraB>
Clear Flags -> Depth only
Culling Mask -> UIのみ
Depth -> 1
2.カメラに映すオブジェクトを用意
次はカメラに映すオブジェクトを配置しましょう。
CameraAに映すCubeとCameraBに映すQuadを作成します(Quadの位置はCubeに重なる程度にしておきましょう)
CubeはレイヤーをDeafult、QuadはレイヤーをUIに設定してください。
3. Game画面を確認してみましょう
カメラの位置をCubeとQuadが映るように調整しましょう(位置はAとB両方とも同じ位置に)
調整できたらGame画面を確認してみましょう。
上の画像の左のGame画面のようにQuadがCubeよりも前に映っているでしょうか?(分かりやすいようにQuadには色をつけています)
なっていない場合は1のカメラの設定、2のオブジェクトとUIのレイヤーの設定を確認してみてください。
右のScene画面ではQuadはCubeにめり込んでいますが、Game画面ではめり込まずに表示されています。
4.どうやって最前面に映しているのか?
今回はCameraBに映るQuadを最前面出しましたが、最前面に出す方法はカメラの設定にある「Depth」という項目を設定することで表現出来ます。
Depthは値が小さいほどカメラに映るものを先に表示しようとします。今回は[CameraA]のDepthは0、[CameraB]のDepthは1になっていますので、[CameraA]に映るCubeが先に表示され、後から[CameraB]に映るQuadが後に表示されるようになっています。
5.注意点
カメラを複数使うにあたって注意点はあります。
カメラの設定にある「Clear Flags」は後から表示するカメラは「Depth only」にしないと前に映すカメラの表示が消えてしまいます。
試しに[CameraB]の「Clear Flags」を「Solid Color」にしてみましょう。Cubeが消えると思います。これはオブジェクト以外の領域を塗りつぶすようにカメラが行っているためです。「Depth only」はそういった塗りつぶしを行わないようにするための設定です。
Clear Flagsの設定項目はUnity公式マニュアルに詳しく載っています
また、カメラの設定の「Culling Mask」は設定したレイヤーになっている対象のみを映す設定項目です。試しに[CameraB]の「Culling Mask」に「Default」を追加してみましょう。Cubeが映りQuadが隠れるはずです。
「Depth」などを設定していても、映す対象を分けておかなければ意味が無いので気をつけましょう。
6.最後に
これだけの事でオブジェクトの表示の制御が可能です。他にも特定のカメラだけ画面エフェクトをかけたりと様々な表現が可能です。
画面エフェクトは個人的に色々表現出来そうなものではあると思うので、機会があれば記事にしたいです。
以上、ツバメでした!