第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を返す
- カメラからの距離とプレイヤーからの距離を区別できる