質問: "Player") .Subscribe(_ => Ray()); } void Ray () { // 追跡を開始するコードを記載 } } ```
回答: 追跡者の前方に位置する直方体を距離0で射出することで、結果的に図中の白い長方形の範囲をスキャンしようという意図かと思いますが、ご提示いただいた【Unity】SphereCastやBoxcastで、球や箱のあたり判定が通過できるか判断する - テラシュールブログによると > > ### BoxCastとSphereCastの死角 > > > BoxcastとSphereCastを利用する上での注意点として、開始地点を含まないといった物があります。 > > > !20160225023229.jpg > > > 例えば下のように接触対象がめり込んでいる場合、判定の範囲外になるのでスルーして上まで線が延びてしまっています。 > > > !20160225094450.jpg > > > これを回避するために各Castの発信位置を下げるのはあまり面白くないので、判定の内側はCheckSphereやCheckBox、もしくはOverlapBoxやOverlapSphereのようなAPIで埋めてしまうのが良いかなと思います > > > とのことですので、おそらくご提示の図の白い長方形内は判定範囲外になってしまい、ヒットを検出できないのではないかと思います。 サイトで言及されているCheckBoxまたはOverlapBoxによる方法に変更してみてはいかがでしょうか? ※CheckBoxやOverlapBoxとレイキャスティングを複合させるのも面白そうです。たとえば... * CheckBoxでプレイヤーのレイヤーを対象に判定を行い、白長方形内にプレイヤーが存在するか判定する。 * プレイヤーの存在が検出されたら、「追跡者forward」ベクトルと「プレイヤーposition - 追跡者position」ベクトルの成す角度を調べ、これが一定以下なら「プレイヤーが追跡者の視界内にいる」と判定する。 * プレイヤーが視界内にいれば、次にプレイヤー周辺を狙って数本のレイを射出しプレイヤーとヒットするか判定する。このとき、対象レイヤーは建物など他オブジェクトのレイヤーも含めるようにして、プレイヤーが他オブジェクトの背後にいればレイとヒットしないようにする。 * レイがプレイヤーとヒットしたら、追跡者を追跡モードに切り替える。 こういった多段階判定なら、レイキャストの回数を節約しつつ「プレイヤーが物陰に隠れていれば追跡者には見つからない」というような精密な視界判定ができそうです。 ### 追記 なるほど、BoxCastがそのように設定されていればうまくいきそうですね。 複数レイが1本のBoxCastに置き換わったことで、もしかすると下図のようにプレイヤーにとって甘めの判定になってしまうかもしれませんが、ゲームデザインによっては(プレイヤーを見逃しても構わない、あるいはそもそも図のような状況にはならないようにしてある、など)問題ないかと思います。 !BoxCast