添付されたコライダーを使用してトランスフォームを特定の位置に移動し、その中の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よ。 このプロセスはフレームごとに複数回発生することがあります(プレーヤーが武器を発射するたびに)
強制的にコリダをアップデートする方法はありますか?
もしそうでなければ...私自身のレイキャストとコライダーを作るべきですか? :(
おかげ
'Bounds.IntersectRay'のようなものを使ってみましたか?オブジェクトに単純なコライダーがある場合(またはあなたのレイキャストが100%正確である必要はありません)、ボックスコライダーのような単純なものに対しては、オブジェクトを取得するために 'object.GetComponent().bounds'を実行することができます。境界オブジェクトを新しい場所に移動して確認してから、オブジェクトが衝突しなかった場合にのみオブジェクトを移動させます。これは、2回移動するよりもパフォーマンスが優れています。https: //docs.unity3d.com/ScriptReference/Bounds.IntersectRay.html –
スマートなソリューションのように、私のコライダーは今のところ単純なカプセルですが、これはもっと複雑なMeshColliderでもうまくいくと思います。私が見る唯一の問題は、すべてのオブジェクトをテストし、それらとレイの起源との間に壁がないことを確認する必要があるということです。レイキャストを投げるだけではなく、なぜそうではないのですか?あなたの助けに感謝します。 – FLX
あなたがリンクした答えを見ると、各物理アップデートの前に呼び出されるので、 'yield return new WaitForFixedUpdate();'を使用しようと思うかもしれないと思っていましたか? – Kardux