2017-11-10 79 views
0

目標是「擴展」給定的模型,以便每件作品都可以單獨查看給用戶,以便用戶可以分別與每個對象進行交互(而不用擔心他們實際操作哪個對象)。團結 - 如何線性分離遊戲對象的孩子?

那麼,如何動態地將遊戲對象的孩子線性地分開?

線性例如: Linear example

因此,在示例中,存在一個空的遊戲對象,它是3個對象的父:一立方體,球體,和膠囊。由於目前是由對象組成的,因此用戶無法看到所有的孩子。

在「膨脹」例如,我採取每個孩子和由(在這種情況下,x)拖動每個沿着相同的軸線手動將它們線性地在同一軸線上分離。如何動態地做到這一點?

首先想到的是計算子女數遊戲對象有,和運行,將移動每個孩子的距離增加,這取決於孩子被移動的母公司循環。例如:child_1沿x軸移動3個單位,child_2移動6個單位,child_3 9個單位等。

這是最好的方式去做這件事嗎?第一本能說,根據物體所佔的大小,這在所有情況下都不起作用。一個孩子的對象可能比另一個大很多倍。如果是這種情況,最好是不是將單位分開,而是將每個子對象移動到其他碰撞邊界之外?

+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個子對象0,1,2和3。嵌套循環將比較對象0(0)和對象1(1),0對比2,0,0:3,1:2,1:3,2:3。通過這種方式,它將每個孩子的collider.bounds與每個其他孩子的孩子進行比較,以確保沒有任何孩子對象正在接觸。

3 - 如果物體正在接觸,則移動一個比較物體,直到它不再與它相比較。例如:0:1移動對象1,直到它不再與對象零相撞。

注意:* 1f(在'移動'中)應該調整到物體之間所需的間隔距離。

編輯 ::代碼不健壯,錯誤檢查和處理沒有在這裏實現。