Skip to content
第10回 3D探索3

1 / 4 画面中央から操作対象を選ぶ ​

このステップの目的

Raycastで最初に当たった物を調べ、プレイヤーが届く対象だけを返す

編集する関数 ​

ExplorerInteraction.FindTargetは、対象のExploreTargetか、対象なしを示すnullを返します。Rayは始点と方向を持つ直線で、Raycastはその方向の物体との交差を調べます。

csharp
Ray ray = view.ViewportPointToRay(new Vector3(.5f, .5f, 0));
if (!Physics.Raycast(ray, out var hit, 12, rayMask, QueryTriggerInteraction.Ignore))
    return null;
if (Vector3.Distance(transform.position + Vector3.up, hit.point) > reach)
    return null;
return hit.collider.GetComponentInParent<ExploreTarget>();

Viewportの(0.5, 0.5)は画面中央です。outで受け取るhitには当たったColliderと位置が入ります。最初に当たった物が操作対象でなければ、最後の行もnullを返します。Colliderが子にある場合に備えて、親までExploreTargetを探します。

12はカメラからの探索距離、reachはプレイヤー側から手が届く距離です。TPSではカメラがプレイヤーの後方にあるため、二つの距離は分けます。

壁越しに選択しない ​

rayMaskには対象だけでなく壁などの遮蔽物も含めます。対象用レイヤーだけに限定すると、壁を無視して奥の鍵を選ぶ場合があります。Triggerはここでは操作対象にしません。

reachが3.2なら、同じ正面の対象でも距離3.1では選択でき、3.3では選択できないことを試します。その後、間に壁を置いて対象が解除されることを確認します。

チェックリスト
  • 近い対象、遠い対象、壁の奥、何もない方向を比較した
  • 対象がない場合にnullを返す
  • カメラからの距離とプレイヤーからの距離を区別できる