読者です 読者をやめる 読者になる 読者になる

テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】SphereCastやBoxcastで、球や箱のあたり判定が通過できるか判断する

f:id:tsubaki_t1:20160225010344j:plain

今回はRaycast以外の判定、SphereCastBoxcastについてです。

足場に微妙に乗ってる時とRaycast

ゲームを作っていると、接地判定や落下判定のために「太い線判定」を行いたくなる事があります。
例えば「地面に足が付いている時にキャラクターを動かすことが出来る、足場が無ければ落下モーションを経由してゲームオーバー」といった表現を行いたいとします。

f:id:tsubaki_t1:20160225012250j:plain

これは一見それほど問題無いように思えますが、これをRaycastで行うと例えば下のような「概ね乗っているが中心点は外れている」といったケースでもゲームオーバーになります。

また「落下モーションで地面にめり込む」や、最悪「地面が無い判定で操作出来ないが落下もしない」といった現象が起こります。

f:id:tsubaki_t1:20160225012402j:plain

この現象は、あたり判定に球や箱を利用しているのに地形判定に線を利用している事で起こります。実際は足が乗っているのに、点でしか判定していないため載っていないように表現してしまう訳です。

解決方法はいくつかありそうです。例えば地形のあたり判定を少し大きくするとか、Raycastを8本用意するとか。ただ今回はRaycastをキャラクターのサイズ並みにぶっとくするといったアプローチを考えてみます。

BoxCastとSphereCast

地形判定はRaycastが定番ですが、Raycast以外にも線形判定はあります。それがBoxcastSphereCastです。
この二つはごんぶとビームのように「球」や「箱」の判定を飛ばし、そこに接触するかを確認してくれます。

例えば下のGif画像ではBoxcastSphereCast、Raycastの順番で動かした場合の落下判定について確認しています。BoxcastSphereCastの場合は穴の大きさより自身が大きい場合は奥まで届きません。

f:id:tsubaki_t1:20160225021410g:plain

検証用コードはこんな感じです。正面にビームを飛ばして判定します。
適当なCubeやSphereにアタッチすると使えます。

gist.github.com

BoxCastとSphereCastの死角

BoxcastSphereCastを利用する上での注意点として、開始地点を含まないといった物があります。

f:id:tsubaki_t1:20160225023229j:plain

例えば下のように接触対象がめり込んでいる場合、判定の範囲外になるのでスルーして上まで線が延びてしまっています。

f:id:tsubaki_t1:20160225094450j:plain

これを回避するために各Castの発信位置を下げるのはあまり面白くないので、判定の内側はCheckSphereCheckBox、もしくはOverlapBoxOverlapSphereのようなAPIで埋めてしまうのが良いかなと思います

死角を考えず使うと、判定がめり込んだ時に判定されず飛んでいくのが分かります。下のgifアニメで判定が飛ばない方は、Checkシリーズでめり込んだ時の挙動も追加することで、判定が飛ぶのを回避しています。

f:id:tsubaki_t1:20160225094338g:plain

uwnskynet.blog.fc2.com

 

関連

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp

tsubakit1.hateblo.jp