2016-05-04 3 views
3

メッシュを1つにして計算し、MeshColliderを追加してパス探索を計算しています。生成されるメッシュは非常に大きく、2つ以上の「メッシュパーツ」にメッシュを分割します。私はそうのようなMeshColliderを設定します。多数の頂点を持つメッシュのための単一のMeshColliderを作成する

testRoom = GameObject.Find("testroom"); 
MeshFilter[] _filters = testRoom.GetComponentsInChildren<MeshFilter>(); 
foreach (MeshFilter _filter in _filters) 
{ 
    _verts.AddRange(_filter.mesh.vertices); 
    _triangles.AddRange(_filter.mesh.triangles); 

    testRoom.AddComponent<MeshCollider>(); 
    testRoom.GetComponent<MeshCollider>().sharedMesh = _filter.mesh; 
} 

これは明らかに衝突が上書きされますので、いくつかのmeshpartsといけない仕事します。メッシュが大きいので、メッシュを一緒にマージしてコライダーを設定することはできません。私はGenerity Collidersボックスを使用してもうまく動作しますが、実行時にメッシュを生成するので、プログラム可能なソリューションが必要です。

多くの頂点を持つためにいくつかの部分に分割された大きなメッシュのための単一のコライダーを作成する方法を知っている人はいますか?

これはメッシュの写真です(要求通り)。それは不思議そうに見えるかもしれませんが、それはオフィスビルの一部です。タンゴのタブレットを使って自分でメッシュを作りました。メッシュがどのように答えに影響するか考えなかったので、私はタンゴタグを含んでいませんでした。

enter image description here

+1

を作る http://docs.unity3d.com/ScriptReference/Collider-bounds.html

希望を境界と新しい箱コライダーを作成する必要があります。原則として、ゲームエンジニアリングでは決してメッシュコライダーを使用しません。 (それらには1つか2つの珍しい用途しかありません) – Fattie

+0

これについて詳細に教えてください。私はそれらを使用しています。なぜなら、それは私が1つにしたいと思っているレイトレーシングをする最も簡単な方法だったからです。 – soncis

答えて

1

私は完全に、あなたの状況を理解していけない正直に言うと、しかし、あなたはまだ右、実行時に個別に各オブジェクトに追加することができますスクリプトから作成された複雑なオブジェクトをカバーする衝突型加速器が必要な場合は?だからではなく、

testRoom.AddComponent<MeshCollider>(); 
testRoom.GetComponent<MeshCollider>().sharedMesh = _filter.mesh; 

のあなたは

var collider = _filter.gameObject.AddComponent<MeshCollider>(); 
collider.sharedMesh = _filter.mesh; 

を行うことができますあなたは別のオブジェクトに、とにかくゲームオブジェクトにあなたがtestRoom.GetComponentsInChildren()から取得する任意のフィルターが装着されているが、複数のMeshFilterコンポーネントを追加カント。したがって、新しいコライダーを個々に追加することができます。

+0

申し訳ありませんが私の状況についてはっきりしていない、あなたのためにそれをより明確に記述する方法がわからない。あなたが提供したコードは本当に素晴らしいMeshCollidersをすべて追加します。私は1つを作成する方法を見つけるまでこれを使用します!私はこれを「正しい答え」としてマークすることはできないと思う。できれば教えてください! – soncis

+1

私の答えが正しいかどうかはあなた次第です。 - だから、あなたは何とかすべてのメッシュをカバーする1つのコライダーを持っていたいですよね?その可能性があるかどうかはわかりません。メッシュを持つすべての子オブジェクトが論理的に1つの大きなオブジェクト(そしてあなたのパスファインダーによって1つのオブジェクトとして検出されても大丈夫です)の場合は、CombineMeshes()メソッドを使用してすべてを1つにまとめ、後でそれに衝突する。私はそれらを組み合わせたり、別々のコライダーを使用する以外は、他の方法で図を描くことができません。 –

+0

私は、誰かが道を見つけるまで正しい答えになるでしょう。私はそれらを組み合わせることはできないと思う。なぜなら、メッシュがフィットするようにメッシュが大きくなっているからである。 – soncis

0

実行中に、すでに行っているように、コライダーを追加することはもちろん可能です。これは非常に重く貧弱なパフォーマンスのソリューションを提供しますが、動作は遅くなりますが遅くなります。この場合の通常の練習は、コリダーとして使用するメッシュの低ポリゴンバージョンのモデリングです。

あなたのオブジェクトがあまりにも複雑でない場合の別の解決策は、ボックスコライダーです。あなたはrenderer.bounds http://docs.unity3d.com/ScriptReference/Renderer-bounds.html をつかむと、それはそれは**あなたがメッシュコライダーを使用する**考えられない感覚

+0

センスがあります。 1つのメッシュだけがコライダーを持ち、それがプログラムで変更されないので、パフォーマンスには関係しません。悲しいことは、メッシュ(2つに分割されたサブメッシュが大きいために大きなメッシュ)がすでに元のデータのほんの一部しか含まれていない低ポリメッシュだったからです。これは考慮されていますが、使用可能。 ボックスコリメータは、メッシュの外側でのみ動作しますか?私は部屋を表すメッシュ内の個々の三角形をチェックする必要があるので、それは使えるとは思わないが間違っているかもしれない。 – soncis

+0

メッシュを見せることができますか?ソリューションを見つけるのがはるかに簡単になる –

+0

私はそれがあなたが望んだものか、実際のファイルを望んだのかどうかは分かりませんが、その写真を投稿しました。 – soncis

関連する問題