今回はRaycast以外の判定、SphereCastやBoxcastについてです。
足場に微妙に乗ってる時とRaycast
ゲームを作っていると、接地判定や落下判定のために「太い線判定」を行いたくなる事があります。
例えば「地面に足が付いている時にキャラクターを動かすことが出来る、足場が無ければ落下モーションを経由してゲームオーバー」といった表現を行いたいとします。
これは一見それほど問題無いように思えますが、これをRaycastで行うと例えば下のような「概ね乗っているが中心点は外れている」といったケースでもゲームオーバーになります。
また「落下モーションで地面にめり込む」や、最悪「地面が無い判定で操作出来ないが落下もしない」といった現象が起こります。
この現象は、あたり判定に球や箱を利用しているのに地形判定に線を利用している事で起こります。実際は足が乗っているのに、点でしか判定していないため載っていないように表現してしまう訳です。
解決方法はいくつかありそうです。例えば地形のあたり判定を少し大きくするとか、Raycastを8本用意するとか。ただ今回はRaycastをキャラクターのサイズ並みにぶっとくするといったアプローチを考えてみます。
BoxCastとSphereCast
地形判定はRaycastが定番ですが、Raycast以外にも線形判定はあります。それがBoxcastとSphereCastです。
この二つはごんぶとビームのように「球」や「箱」の判定を飛ばし、そこに接触するかを確認してくれます。
例えば下のGif画像ではBoxcast・SphereCast、Raycastの順番で動かした場合の落下判定について確認しています。BoxcastやSphereCastの場合は穴の大きさより自身が大きい場合は奥まで届きません。
検証用コードはこんな感じです。正面にビームを飛ばして判定します。
適当なCubeやSphereにアタッチすると使えます。
BoxCastとSphereCastの死角
BoxcastとSphereCastを利用する上での注意点として、開始地点を含まないといった物があります。
例えば下のように接触対象がめり込んでいる場合、判定の範囲外になるのでスルーして上まで線が延びてしまっています。
これを回避するために各Castの発信位置を下げるのはあまり面白くないので、判定の内側はCheckSphereやCheckBox、もしくはOverlapBoxやOverlapSphereのようなAPIで埋めてしまうのが良いかなと思います
死角を考えず使うと、判定がめり込んだ時に判定されず飛んでいくのが分かります。下のgifアニメで判定が飛ばない方は、Checkシリーズでめり込んだ時の挙動も追加することで、判定が飛ぶのを回避しています。