2016-11-15 3 views
2

添付されたコライダーを使用してトランスフォームを特定の位置に移動し、その中の1つがレイキャストによってヒットしているかどうかを確認する必要があります。即座に移動したコライダーをレイキャスティング

foreach(object in objects){ 
    actual_position = object.transform.position 
    object.transform.position = object.new_position 
} 
if(Physics.Raycast(...)) objectHit(); 
// Then I revert each of them them back to their actual_position 

(各オブジェクトについての試験の間に同じ位置)を同じコンテキストで複数回テストした後、レイキャストは、時には、そうでないと(見逃す:

私は素朴な方法(擬似コード)ことをやっ〜50/50)。

は、研究のビットを完了し、発見したレイキャストドキュメントのページで:

あなたは、スクリプトから、あるいはアニメーションによりコライダーを移動する場合は、少なくとも1 FixedUpdateが実行さ ある必要がある物理学ライブラリができるように、 はレイキャストがコライダーに で命中する前にそのデータ構造を更新します。新しい位置です。

私は怒りを和らげ、解決策を探し始めました。 このスレッドは、次の目盛りを待つようにコルーチンを使用しての方法があります。 Raycast doesn't work properly

私はすぐに戻って自分の本当の位置を取得するオブジェクトを必要として、私は、それは私のために動作しませんaffraidよ。 このプロセスはフレームごとに複数回発生することがあります(プレーヤーが武器を発射するたびに)

強制的にコリダをアップデートする方法はありますか?

もしそうでなければ...私自身のレイキャストとコライダーを作るべきですか? :(

おかげ

+1

'Bounds.IntersectRay'のようなものを使ってみましたか?オブジェクトに単純なコライダーがある場合(またはあなたのレイキャストが100%正確である必要はありません)、ボックスコライダーのような単純なものに対しては、オブジェクトを取得するために 'object.GetComponent ().bounds'を実行することができます。境界オブジェクトを新しい場所に移動して確認してから、オブジェクトが衝突しなかった場合にのみオブジェクトを移動させます。これは、2回移動するよりもパフォーマンスが優れています。https: //docs.unity3d.com/ScriptReference/Bounds.IntersectRay.html –

+0

スマートなソリューションのように、私のコライダーは今のところ単純なカプセルですが、これはもっと複雑なMeshColliderでもうまくいくと思います。私が見る唯一の問題は、すべてのオブジェクトをテストし、それらとレイの起源との間に壁がないことを確認する必要があるということです。レイキャストを投げるだけではなく、なぜそうではないのですか?あなたの助けに感謝します。 – FLX

+0

あなたがリンクした答えを見ると、各物理アップデートの前に呼び出されるので、 'yield return new WaitForFixedUpdate();'を使用しようと思うかもしれないと思っていましたか? – Kardux

答えて

0

たぶん、あなたは(あなたの擬似コードに追加すること)、これを試してみることができます。

foreach(object in objects) 
{ 
    actual_position = object.transform.position; 
    object.transform.position = object.new_position; 

    StartCoroutine(CheckToRevertOnNextFixedUpdate(object, actual_position)); 
} 

IEnumerator CheckToRevertOnNextFixedUpdate(object, actual_position) 
{ 
    yield return new WaitForFixedUpdate(); 

    if(Physics.Raycast(...)) objectHit(); 
    // Then I revert each of them them back to their actual_position 
} 

を基本的にこれは、各オブジェクトのために)(次のFixedUpdateに小切手を遅らせ - と復帰します

また、1つのFixedUpdate()フレームのオブジェクトの位置を移動すると視覚的な効果がないものと仮定しています。オブジェクトは新しい位置にテレポートします 帰ってきた。ただし、常にColliderを移動してから、FixedUpdate()の後に残りのトランスフォームを移動することができます。

+0

これはリンクされたスレッドでのやり方ですが、移動中に別のプレーヤーが撮影した場合、実際の位置が間違っている可能性があります(これについては正しいですか?)。また、Paradoxのソリューションはパフォーマンスの点でより良いようです – FLX

+0

@FLXコルーチンを使用するアイデアはそのスレッドと似ていますが、詳細は若干異なり、コンテキストに適用されます。別のプレイヤーが移動中に撃った場合、まだ次のFixedUpdate()でまだコライダーの位置が更新されていないので問題はありません。また、Paradoxのソリューションは、コライダーの形状をバウンディングボックスに近づけることができれば、より効率的になる可能性があります。また、そのプロセスで重大なオーバーヘッドが発生しない場合 – Lincoln

関連する問題