Camera & controls

Corner Correction

コーナー補正

角への小さな引っかかりを位置補正で救う。

6 / 10

Interactive demo

Preparing the demo…

Corner Correction

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

ジャンプした頭が天井の角にほんの少しだけぶつかったとき、そのまま頭を打たせて落とすのではなく、体を横へ数ピクセルずらして通してあげる補正です。当たり判定の上では確かに重なっていても、見た目にはほとんど触れていないので、頭を打って落ちると遊ぶ人は理不尽に感じます。

ゲームでの使いどころ

  • 2D アクションのジャンプ:足場の下の角に頭がかすったとき、横へずらしてそのまま上の足場に乗せる。『Celeste』などの精密なアクションで知られる。
  • 狭い穴・通路への飛び込み:幅ぎりぎりの穴を上へ抜けるとき、少しずれていても通す。
  • 横方向の角:段差の角に足先がかすったときに少し持ち上げて乗せる(ステップアップ)、ダッシュが壁の角にかすったときに横へずらす、なども同じ考え方。

しくみ

上へ動いた結果、頭が天井のブロックと重なったとします。プレイヤーの左右の端を xL,xRx_L, x_R、ブロックの左右の端を bL,bRb_L, b_R とすると、

  • ブロックの左の角に当たったときの重なり:gL=xR−bLg_L = x_R - b_L
  • ブロックの右の角に当たったときの重なり:gR=bR−xLg_R = b_R - x_L

です。補正する最大の幅を cc として、

  1. gL<cg_L < c で、左へ gLg_L だけずらした位置が空いていれば、左へずらして上昇を続ける。
  2. gR<cg_R < c で、右へ gRg_R だけずらした位置が空いていれば、右へずらして上昇を続ける。
  3. どちらでもなければ、ふつうに頭を打ち、縦の速度を 0 にする。

cc はキャラクターの幅の 1/4〜1/2 程度(ドット絵なら 2〜4 ピクセル)がよく使われます。

実装のポイント

  • ずらした先が空いているか確かめる:押し出した先に別の壁があると、壁の中に入り込みます。必ず移動先の当たり判定を調べます。
  • 上昇中だけ:落下中や横移動中に同じ補正をすると、壁をすり抜けて見えることがあります。
  • 軸ごとに解く:横と縦を別々に動かして当たり判定を解く作りにしておくと、「縦の移動で天井に当たった」ことがはっきりわかり、補正を入れやすくなります。
  • 横方向の速度は保つ:補正で位置をずらしても、横の速度は変えません。遊ぶ人の操作をそのまま生かします。

つまずきやすい点

  • 補正の幅が大きすぎる:重なりが大きくても通してしまい、ブロックの中をすり抜けたように見えます。補正はかすった程度だけにとどめます。
  • 狭い隙間での振動:左右両方の角に近い狭い隙間では、左右の補正が交互に起きて震えることがあります。重なりの小さい方だけを選びます。
  • 一方通行の足場:下から通り抜けられる足場では、そもそも頭がぶつからないので補正はいりません。補正の対象を固いブロックに限ります。

デモで試すこと

  1. 2 つの列で、同じ位置から真上に跳び、少しして右へ走り出します。頭の右端が、上の足場の左下の角に 14 cm だけ重なっています(赤い帯)。
  2. 左の「補正なし」は頭を打って落ち、足場の下をくぐって走り去ります。右の「補正あり」は、体が左へずらされてそのまま上昇し、上の足場に乗れます。黄色の線(頭の通った道すじ)の違いを見比べてください。
  3. 「頭と角の重なり」を「補正する最大の幅」より大きくすると、右の列も頭を打つようになります。
  4. 「補正する最大の幅」を 0 にすると、両方の列が同じ結果になります。

References

Unity Cinemachine Position Composer ↗

A general reference for this subcategory.