2013年7月31日水曜日

【Unity】複数カメラを使ってみてつまづいたこと。分かったこと。

今日はUnityのカメラについて調べたこと、分かったことをまとめておこうと思います。

はじめに

なぜいきなりカメラを調べたかって言うとこんなバグにぶつかったから。
残像いっぱい
結局簡単に直せたんですが意味不明すぎて気持ち悪かったので調べました。

いきなりまとめ

ちょっと今日の記事はだらだらと長くなりそうなので結論だけ先に書いときますね。
素人のたどり着いた結論なので詳しい人が見たら間違ってるかも…。

複数カメラを使うときに知っておくこと

  • 深度(Depth)の浅いカメラから順に描画される
  • 各カメラの背景はクリアフラグ(Clear Flags)に従って塗りつぶされる

クリアフラグについて

  • Skybox
    カメラごとに設定されたSkybox(空模様マテリアル)で塗りつぶされる
    カメラにSkyboxが設定されていない場合、既定のSkyboxで塗りつぶされる
    既定のSkyboxも設定されていない場合、Backgroundに指定した色で塗りつぶされる
  • Solid Color
    Backgroundに指定した色で塗りつぶされる。
  • Depth only
    より深度の浅いカメラに任せる?このカメラでは塗りつぶさないよ的な…。
  • Don't Clear
    コレわかんない。

では色々やってみたこと載せときます。

カメラの深度について

とりあえず見てみましょー。

新規Sceneを作成し、下記オブジェクトを配置します。

・Main camera(最初からあるやつ)
 ・座標(0,0,-10)
 ・その他全てデフォ

・Hierarchy->Create->Cube
 ・座標(0,0,0)
 ・サイズ(1,1,1)

・Hierarchy->Create->Directional light
 置くだけ。

・Hierarchy->Create->Camera
 ・名前をSubCameraに
 ・座標(5,2,-5)
 ・回転(0,-45,0)
 ・Clear Flagsを"Skybox"に
 ・Depthは0

SubCameraから見たCube

SubCameraから見た(斜めから見た)Cubeが表示されましたね。

今はMainCameraのDepthが-1、SubCameraのDepthが0なので描画順は

①MainCameraのCube
②MainCameraの背景塗りつぶし
③SubCameraのCube
④SubCameraの背景塗りつぶし

なんだと思います。MainCamera無意味ですね。

ここでMainCameraのDepthを1にすると…

MainCameraから見たCube
MainCameraから見たCubeに変わりましたね。
描画順が入れ替わりました。

Depthの小さいものから描画されて、Depthの大きいものが手前に表示される。

たぶんこんな感じ。カメラ深度終わり。かんたんですね。

でもこれじゃ複数カメラ置いた意味がないですよね。
ゲーム画面用カメラとGUI用カメラとか同時に描画したい。
それを可能にするのがクリアフラグ(きっとそうだと信じたい

クリアフラグについて

冒頭にも書きましたがクリアフラグは4種類から選べます。

クリアフラグ - Depth only

まずMainCameraのDepthを-1に戻しておきましょう。
その状態でSubCameraのClearFlagsをDepthOnlyにしてみましょう。

両カメラから見たCube
2つのカメラから見たCubeがどちらも表示されました。

①MainCameraのCube
②MainCameraの背景塗りつぶし
③SubCameraのCube
④SubCameraの背景塗りつぶさない(DepthOnly)

こんな感じかな?

クリアフラグをDepthOnlyにするとそのカメラの描画しない部分が塗りつぶされなくなります。
より深度の浅いカメラ任せってことですね。

クリアフラグ - Skybox

Skyboxを使うと簡単に空とか背景っぽいものを表示できます。
カメラごとに指定することもできるし、既定の設定として指定することもできます。

背景塗りつぶしのの優先度は
(優先度高) > CameraのSkybox > 既定のSkybox > Background > (優先度低)
みたいです。

MainCameraにSkyboxを設定して確認してみましょう。

カメラにSkyboxを指定

・Assets->Import Package->Skyboxes
標準Skyboxをインポート
・全て選択してImport
インポート
・MainCameraの Inspector->Add Component->Rendering->Skybox

・MainCameraのSkyboxComponentにImportしたSkyboxMaterialをドラッグ
CameraにSkyboxを設定

晴れた空の背景が映りました。

既定のSkyboxを指定

カメラごとにSkyboxを設定しなくてもプロジェクト既定のSkyboxを指定することができます。

・Edit->RenderSettingのSkyboxMaterialに指定できます。
既定のSkybox
何度も書くけどカメラのSkyboxの方が優先されるからね!

クリアフラグ - Solid Color

これはもう名前の通りですね。
Backgroundに指定した色で塗りつぶされます。
Skyboxを選択しててもMaterialが指定されていないとこの動作になります。
Solid Colorで塗りつぶし

クリアフラグ - Don't Clear

これが全然分からなかった。いろいろ触ったけどどういう変化が起きるのか分かりませんでした。
マニュアルでもあまり使わないって書いてあるし別にいいかな。

まとめ

これで結構カメラについての知識が深まりました。
少なくとも複数カメラへの恐怖は無くなったかなw

最初の不具合もすっきり!
カメラ1つでDepthOnlyになってたからうまく背景をクリアできてなかったんですね。
よかったよかった。

Unity系記事まとめ

スポンサーリンク

Related Posts Plugin for WordPress, Blogger...