序章:カメラごとに写るものを変えたい
カメラに写ったものに2D処理を加えるスクリプトを付けていた。
付けていたのは写ったものの解像度を下げたり、減色をするイメージエフェクト的なもの。
普通にカメラ一個でやってるとUIや2Dスプライトにも処理が入ってしまうのでそれを分けたい。
エディタ上ではこんな感じ↓
手前のUIと奥の3Dメッシュの描画を別のカメラで分けてやって欲しかった。
結果はこんな感じ↓奥の3D部分にだけピクセレートエフェクトが入っている。
対処法:Culling Mask でカメラに写すレイヤーを指定
まずは2つ目のカメラを追加する。
ヒエラルキーウィンドウから「右クリック→Camera」でカメラ作成してもいいし、現状のカメラを複製してもいい。
Inspectorから設定を変更してカメラに写るものを変更する。
カメラの設定はこんな感じ↓
写すものの設定は簡単で、Culling Mask 右のメニューから、カメラに写したいレイヤーを選択すればいい。
DefaultではEverythingになっている。
今回はUIを写したいのでUIを選択。
3Dオブジェクトを写す方のカメラは、逆にUI以外のチェックを外しておく。
これでメインカメラにはUIが映らなくなった。
ちゃんと写したいレイヤーが写っているか右下のCamera Previewで確認。
Camera Previewはカメラを選択していないと表示されないっぽいです。
レイヤーを切り替えたい時は、Inspectorの一番上の右側、レイヤーボタンからそのオブジェクトのレイヤーを切り替えられる。
作成時にUI系のボタンやSliderには自動的にUIのレイヤーが割り振られているので楽。
UIじゃなくても、レイヤーを追加して割り振っておけば、そのカメラに写すオブジェクトを指定できる。
レイヤーを追加したい時は一番したのAdd Layerから
UnityでいうレイヤーはPhotoshopとかのレイヤーとちょっと違って、描画順序のことではなく単にオブジェクトの種類分けみたいなものらしい。
Camera の Projection は UIカメラならOrthographicでもいいかもしれないが、自分は元のカメラをコピーしたのでPerspectiveのまま。
Orthographicは3Dソフトでいう平行投影で、パースがついてない状態の超望遠みたいな見え方。
自分はPerspectiveでも特に不具合はなかった。
Render ModeはScreen Space – Cameraに
カメラに写したいものがUIならCanvasにカメラを割り当てないといけない。
CanvasのRender Modeを Screen Space – Cameraにして、Render Cameraに作成したカメラを設定する。
これをやらないとCanvasが表示されないと思う。
デフォルトだとCanvasの Render Modeは Screen Space – Overlayになってるけど、これだとCanvasが画面の最前面に表示されてしまい、カメラの描画順を動かせなくなる。
なのでカメラを分ける時はCanvas側はScreen Space – Cameraにしとくのがいいかと思います。
カメラが一つのみでCanvasがScreen Space – Cameraだと、3Dオブジェクトの位置によってはカメラがオブジェクト重なったりする。
PlaneDistanceが100になっているのはカメラを一個でやってた時にこれで3DオブジェクトとCanvasの前後関係を調整していたからです。
PlaneDistanceはカメラの座標からエディタ上でCanvas が見える位置までの距離、的なもの。
カメラを複数に分けて描画順を設定してれば無問題です。
カメラの描画順について
複数のCameraの描画順はInspectorのCameraコンポーネントのDepthで設定できる。
Depthの値が大きい方が(画面上で)手前、小さい方が奥に表示される。
なのでUIのカメラのDepth を0 、メインカメラのDepthを-1とかにすれば最初に出したゲーム画面にみたいになる。
ClearFlagのSolidColorの注意
CameraのClear Flag、そのカメラに写ってない部分をどう処理するかの設定
で、defaultだとSkyBoxになっている。
これSolid Colorにするとそのカメラに写ってない部分は全て一色で描かれるので注意。
自分はUIのカメラでここをSolid Colorにしてたせいで、背景のオブジェクトが見えなくなる失敗が起きてた。
UIなら写っている部分以外は透過して欲しいと思う
その場合はClear Flags は Depth Onlyにすると良いと思います。
一瞬何が起きたか分からずにはまりました。
描画順が一番下のカメラであれば、Solid Colorでも問題ないです。
AudioListenerは一つだけ
カメラを作成するとAudioListenerコンポーネントが勝手にくっ付いてきちゃいます。
一つなら大丈夫なんですが、2つAudioListenerがあるとエラーが出てきますので、メインカメラ以外のAudioListenerは削除しておきましょう。
Audio Listenerは、Listenerなので再生した音を聞いてくれて、デバイスのスピーカーに渡してくれるもののようです。3D空間上のマイクみたいなものです。
Audio CLipはmp3とかwavとかの音の元データ。
Audio SourceはAudio再生用のコンポーネントで、くっつけたAudio Clipの音を再生してくれます。
流れとしてはこんな感じだと思います。
Audio Clip(音データ) → Audio Source(再生する) → Audio Listener(音を拾う)
参考図書