テラシュールブログ

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

Raycastで1個のオブジェクトに複数回当たるようにした

1個のオブジェクトに複数当たるRaycastを考えた。
正直な話、Raycastは接触判定用であって、こういった探索には重すぎると思うのだが、まあ稀に役に立つのかもしれない。

スクリーンショット 2013-09-07 23.29.47

Unityの当たり判定の最小単位はメッシュ(コライダー)単位なので、それ以下の精度では取得することが出来ない。特に単純なRaycastは直近の判定しか返さないので、複数判定を返したい場合は一捻りする必要がある。

やっていることは単純

  1. RaycastAllで範囲内にある全コライダーを取得
  2. 1の手順を逆方向からも行う
  3. 1と2からオブジェクトの幅を確認し、Collider.Raycastを飛ばす。接触したらその少し先から再度飛ばす
box samplebox sample2
図は1と2の手順で得られる座標。1個のオブジェクトの幅を求めることが出来る。RaycastAllを使用している理由は単純で、RaycastAllならば複数のオブジェクトがあった場合も2回のRaycastAllでオブジェクトの範囲が取得できる。

次はオブジェクトの内部を調べるのだが、この際Physics.RaycastではなくCollider.Raycastを使用する。Collider.Raycastは「同一コライダー以外を無視」するので、こういった場合には非常に向いている。またRaycastの距離は接触点から考えてどんどん短くする。Raycast的には探索する対象となるオブジェクトの数が少なければ少ないほど早いので、こういった制限を行うことでRayを撃ちまくるのと比べて多少の高速化が見込めると思う。

ちなみに、ソースコードはこちら。
MultiHitRay.CheckMultiHitRayを呼べば接触箇所のVector3一覧が帰ってくる。

 
まあRayはCPUをかなり消費するので、余り使わないほうが良いと思う