ひとことで
カメラが動いてよい範囲(制限領域、コンファイナー)を決めて、画面がその範囲からはみ出さないようにカメラの位置を押し戻すしくみです。プレイヤーを追うだけのカメラは、ステージの端に来ると、作っていない真っ暗な場所や、見せたくない裏側まで映してしまいます。制限領域があれば、端ではカメラが止まり、プレイヤーだけが画面の端へ寄っていきます。
ゲームでの使いどころ
- 横スクロールのステージの端:ステージの左右の端や、地面より下を映さない。
- 部屋ごとの枠:天井の低い部屋、広い部屋、縦に長い部屋など、部屋の形ごとに枠を分け、部屋を移ったらカメラを新しい枠へなめらかに動かす。『メトロイド』型の探索ゲームで多用される。
- ボス戦の固定画面:ボスの部屋に入ったら、部屋全体が収まる位置にカメラを固定する(枠の大きさを画面と同じにする)。
- 3D の三人称カメラ:壁の向こうや地面の下にカメラが入らないよう、カメラが動ける空間を制限する。
しくみ
画面の中心を 、画面の半分の幅と高さを 、制限領域を とします。画面の端が枠からはみ出さない中心の範囲は なので、
のように、軸ごとに範囲へ押し込みます( も同じ)。枠の幅が画面より狭いときは、この範囲が空になるので、枠の中央に置きます。
部屋ごとに枠を分けるときは、プレイヤーがいる部屋の枠で押し込んだ位置を目標にし、指数減衰で近づけます。部屋を移った瞬間に目標が大きく変わっても、カメラはなめらかに移動します。
実装のポイント
- 最後にかける:デッドゾーン、先読み、揺れなど、ほかの処理で決めた位置を、最後に枠へ押し込みます(ただし画面の揺れは枠の後に足すと、端でも揺れが見えます)。
- 3D の透視投影:3D のカメラでは、見える範囲がカメラからの距離で変わります。ゲームの平面上での見える範囲を計算してから押し込むか、スプラインドリーのようにカメラの通り道自体を決めてしまいます。
- 形が複雑な枠:L 字型の部屋などは、多角形の枠を使い、画面の四隅がすべて多角形の中に入るように押し戻します。Unity の Cinemachine Confiner は、画面の大きさだけ内側に縮めた多角形を作ってから、中心をその中へ押し込んでいます。
- 部屋の切り替えの判定:プレイヤーが部屋の境目を行き来すると、カメラが行ったり来たりします。境目に少し重なりを持たせる(ヒステリシス)と落ち着きます。
つまずきやすい点
- 縦長・横長の画面:画面の縦横比が変わると、見える範囲も変わります。ウィンドウの大きさが変わるたびに、半分の幅と高さを計算し直します。
- 枠が画面より狭い:狭い部屋では押し込む範囲が空になり、計算が破綻することがあります。中央に置く処理を忘れないようにします。
- 急な止まり方:押し込みで急にカメラが止まると、ぶつかったように見えることがあります。目標の位置を押し込んでから、なめらかに追わせます。
デモで試すこと
- 「制限なし」にして、プレイヤーがコースの左端へ行くのを待つと、左下の小窓(実際の画面)の左側に、何もない暗い場所が映ります。右下のグラフの「ステージの外が映っている割合」が上がります。
- 「ステージ全体の枠」にすると、白い枠(ゲームカメラの範囲)が緑の枠からはみ出さなくなり、端ではプレイヤーだけが画面の端へ寄ります。グラフは 0 のままです。
- 「部屋ごとの枠」では、天井の低い左の部屋にいる間、カメラは暗い上の空間を映しません。右の部屋へ移ると、緑の枠が切り替わり、カメラがなめらかに移ります。
- 「部屋を移るときの動きの速さ」を変えて、切り替えの感じの違いを比べてください。