カメラ・操作感

デッドゾーン

Camera Dead Zone

対象が枠内にいる間はカメラを動かさない。

1 / 10

インタラクティブデモ

デモを準備しています…

デッドゾーン

ドラッグで視点を回転、Ctrl(⌘)+ スクロールでズーム。タッチ操作は 2 本指です。

ひとことで

画面の中央に「カメラが動かない枠」を置き、プレイヤーがその枠からはみ出した分だけカメラを動かす追従のしかたです。枠の中での小さな動き(その場のジャンプ、少しの後退)では画面が止まったままなので、画面の揺れが減り、遊ぶ人が酔いにくくなります。横スクロールのアクションゲームのカメラは、ほぼ必ずこの考え方で作られています。

ゲームでの使いどころ

  • 2D アクション・横スクロール:ジャンプのたびに画面が上下に揺れないよう、縦方向に高めのデッドゾーンを置く。段差を上りきって着地したときだけカメラを上げる作りもよく使われる。
  • 見下ろし型のゲーム:小さく歩き回っても画面が動かないようにし、部屋の端に近づいたときだけスクロールする。
  • 3D の三人称カメラ:キャラクターの向きの小さな変化ではカメラを回さず、一定以上ずれたら回し始める(角度のデッドゾーン)。
  • 照準:画面中央付近ではカーソルだけが動き、外側に近づくとカメラが回り始める作りも同じ考え方。

しくみ

カメラの中心を cc、追いかけたい点(プレイヤーの胸のあたり)を pp、デッドゾーンの半分の幅を ww とします。横方向だけで書くと、カメラが目指す位置 c∗c^{*} は

c∗={p−w(p>c+w)p+w(p<c−w)c(それ以外)c^{*} = \begin{cases} p - w & \quad (p > c + w)\\ p + w & \quad (p < c - w)\\ c & \quad (\text{それ以外}) \end{cases}

です。プレイヤーが枠の右端を越えたら、枠の右端がプレイヤーに重なる位置までカメラをずらし、枠の中にいる間は動かしません。縦方向も同じように別の幅で計算します。

実際には c∗c^{*} へ一気に動かすとカクッとするので、指数減衰で追いつかせます。

c←c+(c∗−c) (1−e−k Δt)c \leftarrow c + (c^{*} - c)\,(1 - e^{-k\,\Delta t})

kk が大きいほど素早く追いつきます。e−kΔte^{-k\Delta t} の形にしておくと、フレームレートが変わっても同じ速さで追いつきます。

実装のポイント

  • 縦と横で幅を変える:横はプレイヤーの進む先を見せたいので狭め、縦はジャンプで揺れないよう広めにするのが一般的です。
  • 着地したときだけ縦を合わせる:空中にいる間は縦のカメラを止め、足場に着地したときにその高さへ合わせる(プラットフォームスナップ)と、ジャンプ中の画面がさらに落ち着きます。ただし大きく落ちるときは追いかけないと画面の外に出るので、下向きの限界は別に設けます。
  • 先読みと組み合わせる:デッドゾーンの中心を、進む方向に少しずらすと、先読み追従と両立できます。
  • ステージの端:デッドゾーンで求めた位置を、最後にカメラ制限領域で押し戻します。

つまずきやすい点

  • 枠が広すぎる:プレイヤーが画面の端近くまで行けてしまい、進む先が見えなくなります。画面の幅の 1/6〜1/4 くらいから調整します。
  • 追いつく速さが遅すぎる:はみ出したまま戻らず、速く走るとプレイヤーが画面から出てしまいます。はみ出しが大きいときほど速く追いつくよう、ばね(臨界減衰)で追わせる方法もあります。
  • 物理の更新とのずれ:プレイヤーを固定タイムステップで動かし、カメラを描画フレームで動かすと、両者の時間がずれてプレイヤーが小刻みに震えて見えます。カメラはプレイヤーの補間後の位置を追います。

デモで試すこと

  1. 「常に中心に置く」にすると、ジャンプのたびに白い枠(ゲームカメラの範囲)が上下に動き、右下のグラフがぎざぎざになります。左下の小窓(実際の画面)も上下に揺れます。
  2. 「デッドゾーン」に戻すと、黄色い枠の中での小さなジャンプではカメラが止まり、グラフが平らになります。段差を上ったときだけ階段状に上がります。
  3. 「デッドゾーンの幅」を大きくすると、プレイヤーが画面の端近くまで行ってからカメラが動き出すことを確かめてください。
  4. ←→ とスペースキーで自分で操作すると、画面の揺れの少なさを実際に感じられます。

参考資料

Unity Cinemachine Position Composer ↗

分野全体の資料で、この項目を直接扱っているとは限りません。