「Unity2D」 横スクロールアクションゲームのカメラアングルを設定する&カメラ設定一通り

「Unity2D」 横スクロールアクションゲームのカメラアングルを設定する&カメラ設定一通り

これからUnityちゃんの2Dアクションゲームを作っていくわけですが、まず覚えておきたいのが横スクロールアクション定番のプレイヤーの動きに合わせて横に動くカメラワークでしょう。

ついでにカメラの設定に関して一通りの操作方法は理解できるようにまとめてみました。

photo by Thord Daniel Hedengren

目次

「Inspector」カメラの設定

まずはMainカメラの設定から見ていきましょう。

Clear Flags

  • 「Skybox」

Skyboxとは空のレイアウトを見せるための背景です。デフォルトでも用意されていますが自分の用意してきたマテリアルに設定する事もできます。

カメラの設定で言う所のSkyboxとはカメラによって出力するGameビューにSkyboxを表示するか非表示にするかの切り替えとなります。

  • 「Solid Color」
camera

Solid Colorに設定すると背景が固定された一色になります。デフォルトでは「Baceground」の青色系になっています。

  • 「Depth only」

オブジェクトが重なっても表示させておきたいオブジェクトに設定します。この場合カメラ設定のDepthの値によって優先度が決まります。

  • 「Don’t Clear」

色・深さの情報がクリアされないという設定です。

Background

「Clear Flags」の設定がSkyboxまたは、Solid Colorになっている時に表示されます。色を設定するためのダイアログから背景色の色を自由に設定する事ができます。

Culling Mask

カリングマスクのCull(ingで現在分詞) には摘む、間引くという意味があるので、各オブジェクトで設定したLayerごとに投影する、しないオブジェクトを仕分けるための設定です。

この画像はUnityちゃんに「Player」と上ブロックの固まりにそれぞれ「Block」というLayerを設定して、カリングマスクに「Player」「Block」のLayerを表示されるように設定しています。

camera3

それ以外のオブジェクトは初期値で「Default」Layerになっていて、「Default」は指定から外しているので表示されていません。

ただしカメラの表示から外れるというだけでオブジェクトのコライダーなどの物理的な処理は働いています。
▼「下…Gameビュー」これはカメラには見えていないけど”地面は存在する”という処理になる

camera

全てのLayerを表示したい場合は「Everyting」を選択する。「Nothing」を選択したらSkybox以外非表示になりました。

Projection

ここでいうProjectionは投影方法という意味でカメラの投影方法のモード切り替えを行うための設定です。

  • 「Perspective / 透視投影(とうしとうえい)」

3D空間のオブジェクトを2Dで表現するためにあるレンダリング方法です。遠近感のある描写ができます。Perspectiveからパースとも呼ばれいます。

  • 「Orthographic / 平行投影」

Perspectiveは距離感を出すレンダリングでしたが、Orthographicは距離によってオブジェクトの大きさを変えないというレンダリング方法です。遠近感のない投影方法という事になります。

Size

Gameビューのレンダリング映像を拡大縮小するための設定です。「Perspective/透視投影」モードにした場合はField of Viewという項目が現れるのでこちらから拡大縮小できます。

Clipping Planes

クリッピングプレーンとは四角錐台 (すいだい) と呼ばれる図形のカメラ側の方をNear、その逆側のカメラから一番通い位置の方をFarとしてそのNearとFarの間がレンダリングされる範囲になるというものです。

距離感が求められるものなのでPerspectiveを設定している場合に有効になります。クリッピングの調整はNear、FarそしてField of Viewで行います。

文章にすると難しそうな感じがしますがシーンを3D表示にすればすぐ理解できます。画像を用意したので見て下さい。

▼クリッピングプレーン (四角錐台/台形を3Dにした形) を調整している様子
camera4

この画像を見ればわかると思いますが、四角錐台内に収まっている部分がカメラの撮影できる範囲となるわけです。
▼「Near」・「Far」それぞれの位置
camera5
赤色の矢印範囲内が描画範囲です。

Viewport Rect

「X、Y、W、H」に0~1 (小数点含め) の値をいれてGameビューの表示を調整する設定です。 家庭用ゲームの対戦で1P、2Pと画面表示が分かれる場合にも使えそうな機能になります。

▼例えばこのようにGameビューを分割して複数のカメラ映像を同時表示する事ができる
camera5

  • 「上カメラ」… Y/0.5
  • 「下カメラ」… H/0.5
  •  

▼「3分割」こういったカメラワークも出来ます。
camera6

  • 「カメラ1」… X/0.0, Y/0.3, W/0.7, H/1.0
  • 「カメラ2」… X/0.0, Y/0.0, W/1.0, H/0.3
  • 「カメラ3」… X/0.7, Y/0.3, W/1.0, H/1.0

Rendering Path

レンダリングパスは映像や音声を生成し表示するレンダリングという意味と通り道、または経路という意味もあるパスを合わせレンダリング方法といったようなニュアンスの設定です。

  • 「Use Player Settings」… 設定に従ったレンダリングを行う
  • 「Forward」… 従来のレンダリング手法
  • 「Deferred」… 高品質なレンダリング処理 (遅延レンダリング)
  • 「Legacy Vertex Lit」… 頂点単位のみライティング (頂点ライティング) を行うのでレンダリング速度は早い
  • 「Legacy Deferred」… 高品質なレンダリング処理 (遅延レンダリング/前バージョン)

Legacy Vertex Litを試したらこんな感じになってしまった

camera8

Target Texture

レンダーテクスチャを使用する時に利用します。レンダーテクスチャはカメラで撮影した映像をそのままGameビューのオブジェクト内に映し出す事ができます。

ゲームの中のテレビオブジェクトのモニターにカメラで撮影したものをレンダリングしたり、鏡オブジェクトにプレイヤーを映したりといった用途に使えるでしょう。

▼マテリアルが鏡なので自分自身途中で勘違いしていましたが “カメラで撮影しているプレイヤーを背後の鏡に映し出している” という状態です。
camera8
なので鏡の中のUnityちゃんの背後にあるのはカメラが撮影した鏡です..。なので鏡にしたい場合は鏡のオブジェクトからカメラを配置になりますね。

まずはプレイヤーと鏡となるオブジェクトを用意してそこに鏡のマテリアルを貼り付けます。

Projectから「Create」→「Render Texture」を選択・作成し、作成したRender Textureを鏡オブジェクトに貼り付けます。

次に追加の鏡側の映像を映し出すためのカメラを追加で作成し、そのカメラのTarget TextureにRender Textureを貼り付ければ完成です。

Occlusion Culling

オクルージョンカリングは3D空間の

▼このように下で表示されているカメラで映っていないボールはGameビューの視点では表示されませんが、Unityの内部的には遮っているオブジェクトの後ろの見えていない部分もレンダリング処理されている事になっているのです。

camera6

そこでオクルージョンカリングの機能を有効にする事でGameビューの視点から見えない部分のレンダリングをしないようになります。こうする事で描画にかかる計算コストを削減できます。

ただしオクルージョンカリングはオブジェクトの数が多い程有効な機能で、オブジェクトの数が少ない場合はオクルージョンカリングにかかる計算コストが負担になってしまう場合もあるとの事。

HDR

HDRはHigh Dynamic Range (ハイダイナミックレンジ) の略で写真技法の一つになります。写真・映像で出力した時に光で明るくなり過ぎて画質の状態が飛んでしまったり、逆に暗くなり過ぎて黒く見えずらくなってしまうという事を防ぎ、本来の画質状態を忠実に再現する事が可能という技術です。

明るさと暗さの表現の幅を広げます。Phoneでは4.1からこの機能が搭載されていて、テレビでは4Kの次2016年はHDRだと言われている技法だそうです。

UnityではBloomという例えば電気の発光が周囲のオブジェクトの明かるさにも影響を与えるのを表現する方法があり、このBloomを使う時に併用してHDRを使用する場合があるようです。

Target Display

こちらはマルチディスプレイを設定するための機能です。プルダウンの中を見ると「Display 1 ~ Display 8」まであり8台までのモニターに同時出力する事ができます。
camera7

【英語の意味】
  • 「solid/ソリッド」… 固体、中身が詰まっている
  • 「projection/プロジェクション」… 投影法、映写、見積もり・計画
  • 「perspective/パースペクティブ」… 遠近法、透視図法、見通し
  • 「orthographic/オーソグラフィック」… 正投影の、正字法の
  • 「cull/カリング」… 選び取る、間引き、摘む
  • 「clipping/クリッピング」… 刈り取り、切り抜き
  • 「near/ニア」… 近い、接近、(似ている単語でよくnearbyと比較される)
  • 「rect/レクト」… 長方形、矩形(くけい) rectangle/レクタングルの略語、正しい
  • 「Occlusion/オクルージョン」… 閉鎖、塞がれている
  • 「range/レンジ」… 幅、変動、最小と最大の幅の領域
  • 「vertex/バーテックス」… 頂点

GUIカメラの設定は以上です。このようなカメラワークを覚えれば様々なゲームシーンに活用できます。

カメラアングル -テスト-

作業しながら動作を確認したいのがカメラアングルです。横スクロールアクションゲームのカメラアングルを設定目標とします。
まずは2D用のUnityちゃん&それらしくオブジェクトを少し配置して、MainカメラをHierarchyからUnityちゃんの下階層に合わせました。
デフォルトでUnityちゃんは「←」「→」動作はするようです。一度これで確認してみましょう。

上が作業しているシーン画面で下がゲームで表示される画面です。なんかカメラの動きがおかしいです。

camera9
プレイヤーオブジェクトの下階層にカメラを合わせると常にプレイヤーにカメラがくっついている状態になるので、ゲームをするユーザーが「←」を押しても「→」を押してもユーザーから見た視点は一定の位置になってしまうのです。

3Dでプレイヤーが自由に動き回るようなゲームならこの方法で問題ないようですが。こうなるのを改善するにはプレイヤーを直接見ている視点から移動先を見る視点に変えるという設定が必要みたいです。

「横スクロールアクション」プレイヤーをカメラが追従する

プレイヤーオブジェクトにMainカメラオブジェクトを入れ子にしたカメラアングルでは左右どちらがに移動してもカメラ視点が一定になってしまいました。
これを改善するにはカメラがプレイヤーを追従している状態で、プレイヤーが左右どちらに移動してもカメラの視点は固定する必要があります。

public class CameraAngle : MonoBehaviour {
    GameObject player;
    GameObject mainCamera;

    void Start () {
        player = GameObject.Find("UnityChan2D");
        mainCamera = GameObject.Find("Main Camera");
    }

    void Update () {
        transform.position = new Vector3(player.transform.position.x, 5.5f, -15);
    }
}
camera2

GameObject.Find()

GameObject.Find(“オブジェクト名”) を指定する事でオブジェクトを取得しています。StartはUpdateが呼び出される前に一度呼び出されています。

今回のコードだとまずStart関数で”UnityChan2D”と”Main Camera” のオブジェクトが取得されているという事です。

カメラが追従するプレイヤーを変える

モアイ風オブジェクトを配置してみました。このオブジェクトにカメラの視点を切り替えます。そのような場合は先ほどのコードのGameObject.Find()のオブジェクト名を変更するというだけです。
camera4

player = GameObject.Find("moai")

「その2」プレイヤーをカメラが追従する

先ほどのものはx軸の動きがプレイヤーの動きに固定されていたというスクリプトなのでプレイヤーが上に行ったり下に行ったりするとその動きを追う事はしません。

ゲームによってはそのカメラワークだけでもありだとおもいますがここにプレイヤーが上に行ったり下に行ったりするという動きも追従するというスクリプトに変更してみましょう。

public class CameraAngle : MonoBehaviour {
    GameObject player;
    GameObject mainCamera;

    void Start () {
        player = GameObject.Find("UnityChan2D");
        mainCamera = GameObject.Find("Main Camera");
    }

    void Update () {
        transform.position = new Vector3(player.transform.position.x, player.transform.position.y, -15);
    }
}
camera3

まとめ

Gameビューの画像がカクカクしていますがGIFアニメのコマ数をできるだけ少なめにしているので実際の動きはもう少しだけ滑らかです。ジャンプに関しては今回ただジャンプを実装したかっただけなので少々強引なスクリプトです。

とりあえず2Dスクロールアクションゲームを制作する上で使用するカメラワークはこんな所でしょう。長くなってしまったので次回の記事で色々ご紹介します。

imageLicenseLogo
この作品はユニティちゃんライセンス条項の元に提供されています

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次