2017-12-04 6 views
0

BoxColliderの範囲内にあるベクトル(原点)からray/sphereをキャストし、maxDistanceを超えないように制限したいバインドされた領域を取得し、このバインド内のオブジェクトだけをlayerMaskでヒットします。これをどのように達成するのですか?境界領域内でのゲームオブジェクトの選択(変換を使って一般的な方向のgameObjectを選択する)

また、これをsphereCastとしてキャストし、複数のオブジェクトがヒットした場合、sphereCastの中心に最も近いオブジェクトのみを取得する方法はありますか?私はしばらく検索してきましたが、そこではそれを得ることができませんでした。

編集#1

Example

私は以前の回答をお願い致しますが、私は本当に達成するために何をしたいのより良い精緻化のためにこの編集を更新します。

あなたに最初の質問をしたところ、見つからなかった不足しているrayCast/sphereCastを解決する方法はまだわかりませんでした。どちらかといえば、最終的にはtarget/sphereCastの半径のサイズによっては見逃してしまいます。

最後の目標は、ゲームオブジェクトを選択するための方向入力を持つことです。私は既にリスト内のgameObjectsの変換を集めているこの境界ボックスを持っています。もし私がゲームパッドのアナログスティックで正規化された方向を与えて入力すれば、その一般的な方向のものを選択したかったのです。しかし、もし私がrayCast/sphereCastでそれを行うのであれば、入力ごとに複数のキャストをしなければならないことに気付いています。理想的なのは、正規化入力dir:vector2(1,0、0)の場合、原点から2時の位置にある紫色のターゲットが選択されます。

答えて

0

センターに最も近くなるようにするには、ヒットコリダーの変換を取得し、それらをループしてセンターから位置を引くことができます。次に最小の大きさを選びます。パフォーマンスを向上させるには、振幅の二乗を使用できます。

ボックスコライダー内のものだけを選択する場合、1つの方法は、ボックスの最大寸法に等しい半径の球キャストを使用することです。これはボックスの外側にも届きますが、箱の中のすべてを得ることが保証されています。次に、従来の衝突チェックを使用して、ボックスコライダー内にあるかどうかを手動でチェックできます。

0

1:それはあなたの状況に最適ですとして

私は示唆しているが、Physics.OverlapBox

を見て:

は、すべてのコライダーが触れたり、与えられた箱の内側にして下さい。

あなたは、ボックスコライダーの中心とサイズをパラメーターとして渡すことができます。これは、重複する(ヒットした)コライダーの配列を返し、最初のものを使用することができます。

2:

それでもSphereCastを使用する場合、それはあなたがあなたの境界としての衝突を持っている場合、あなたは、単に使用することができますcolliderプロパティ

0

にヒットした最初のオブジェクトを持っているRaycastHitオブジェクトを移入Collider.bounds.extentsまたはCollider.bounds.sizeあなたのコライダーのサイズを取得し、(あなたの開始位置に応じて)Spherecastの最大サイズを設定します。例えば。SphereCastがキューブの途中で開始された場合は、最大サイズとしてCollider.bounds.extentsの値のいずれかを使用します。

Physics.SphereCastAllの場合、RaycastHitsの配列が返されます。これらのプロパティにはdistanceというプロパティがあり、これはレイキャストの起点からコライダーがヒットしたポイントまでの距離を返します。単純に配列を反復処理して、最も距離の近いオブジェクトを使用して、最も近いオブジェクトを取得することができます。

また、Physics.SphereCastは、ヒットした最初のオブジェクト(したがって最も近いオブジェクト)を返す必要があります。しかし、これは常にあなたが望むように動作するかどうかは分かりませんが、Physics.SphereCastAllメソッドを使用するよりパフォーマンスが向上するため、テストする価値があります。

関連する問題