2017-11-10 10 views
0

目標は、ユーザーが個別に各オブジェクトを個別に表示できるように、特定のモデルを「展開」することです(実際にどのオブジェクトが実際に操作されているか心配しないで)。Unity - ゲームオブジェクトの子を線形に分割する方法は?

だから、どのように動的に子供たちを線形に分割するのですか?

リニア例:立方体、球、カプセル: Linear example

そこで実施例では3つのオブジェクトの親である空のゲームオブジェクトがあります。オブジェクトが現在作成されているため、ユーザーはすべての子を見ることができません。

「拡張」の例では、同じ軸(この場合はx)に沿って手動でドラッグすることによって、それぞれの子を取り込んで同じ軸で線形に区切ります。どのようにこれを動的に行うのでしょうか?

最初に考えられるのは、ゲームオブジェクトが持つ子の数を計算し、移動する子に応じて各子を移動させるループを親によって実行することです。例:child_1はx軸に沿って3単位を移動し、child_2は6単位を移動し、child_3は9単位などを移動します。

これを行うにはこれが最善の方法ですか?最初の本能は、オブジェクトが占めるサイズに応じて、すべての場合にこの機能が動作しないと述べています。 1つの子オブジェクトが別の子オブジェクトの何倍も大きくなる可能性があります。この場合、単位ではなくオブジェクトを分離する方がよいでしょうが、各子オブジェクトを衝突境界の外に移動させることによって、より良いでしょうか?

+1

['Collider.bounds'](https://docs.unity3d.com/ScriptReference/Collider-bounds.html)をチェックすることで、各オブジェクトの高さをほぼ知ることができます。その情報を使用して、オブジェクトが重ならないようにオブジェクトを移動する必要がある場所を特定するのは簡単です。 – Serlite

+0

@Serliteはい、collider.boundsはまさに私が必要としていたものでした。ありがとうございました! – jtth

+0

あなたはそのヒントであなた自身で解決策を推論できました!それが学ぶ最も良い方法です。 – Serlite

答えて

0
int numChildren = gameObject.transform.childCount; 
for (int i = 0; i<numChildren; i++) 
{ 
    for (int a = i+1; a<numChildren; a++) 
    { 
     while (gameObject.transform.GetChild(a).GetComponentInChildren<Collider>().bounds.Intersects 
      (gameObject.transform.GetChild(i).GetComponentInChildren<Collider>().bounds)) 
     { 
      // print 
      Debug.Log("Bounds intersecting " + i + ":" + a); 

      // moving 
      gameObject.transform.GetChild(a).GetComponentInChildren<Transform>() 
       .transform.Translate(Vector3.right * 1f, Space.World); 
     } 
    } 
} 

1 - 子供の数が

2オブジェクトを取得します - 子供の境界は、他のチャイルズの境界と交差するかどうかを確認するためにforループをネストされたを使用します。

例:gameobjectには、4つの子オブジェクトzero、one、two、およびthreeがあります。ネストされたループは、オブジェクト0(0)をオブジェクト1(1)と比較し、0は2、0:3,1:2,1:3,2:3と比較します。この方法で、各子のcollider.boundsを他のすべての子と比較して、子オブジェクトのどれもが接触していないことを確認します。

3 - オブジェクトが接触している場合は、比較したオブジェクトと交差しなくなるまで、オブジェクトを移動します。 Ex:0:1は、オブジェクト1とオブジェクト0が衝突しなくなるまでオブジェクト1を移動します。

注:* 1f(「移動中」)は、オブジェクト間の分離の望ましい間隔に調整する必要があります。

EDIT ::コードは堅牢ではありません。エラーチェックと処理はここでは実装されていません。

関連する問題