2016-01-15 194 views
0

我有一個非常簡單的例子:在一個平面上有2個立方體,玩家可以通過鼠標輸入移動一個立方體。停止剛體碰撞後移動

每個立方體都有一個對撞機和剛體連接,以及一個0次反彈的高摩擦材料。

我想要實現的是:如果一個立方體要與另一個立方體接觸,我想阻止這兩個立方體互相推擠或互相碰撞 - 我希望他們互相起到隔牆的作用。

什麼我得到是這樣的:

enter image description here

我曾嘗試是對多維數據集的IsKinematic選項開關,同時我拖累他們,但是這導致了沒有結果。

這裏是我的代碼:

private Vector3 screenPoint; 
private Vector3 offset; 
private Vector3 oldPosition; 

private Rigidbody rBody; 

private bool dragging = false; 

void Awake() 
{ 
    rBody = gameObject.GetComponent<Rigidbody>(); 
} 

void OnMouseUp() 
{ 
    dragging = false; 
    rBody.isKinematic = false; 
} 

void FixedUpdate() 
{ 
    if(dragging) 
    { 
     Vector3 cursorPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z); 
     Vector3 cursorPosition = Camera.main.ScreenToWorldPoint(cursorPoint) + offset; 

     cursorPosition.y = oldPosition.y; 

     rBody.MovePosition(cursorPosition); 
    } 
} 

void OnMouseDown() 
{ 
    screenPoint = Camera.main.WorldToScreenPoint(rBody.position); 
    offset = rBody.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z)); 
    oldPosition = rBody.position; 
} 

void OnMouseDrag() 
{ 
    dragging = true; 
    rBody.isKinematic = true; 
} 

任何幫助表示讚賞。謝謝。

+0

你試過鎖定剛體上的位置嗎?您可以在檢查員中執行此操作:) – Tom

+0

感謝您的輸入,@Tom。是的,我曾嘗試加入X和Z在檢查的剛體凍結位置的限制,但這樣做,我的鼠標移動的立方體腳本將不以任何形式使用。 :( – ExplodingTiger

+0

@JoeBlow - 對不起不夠明確,我會試着更好地解釋:用戶開始拖動白色立方體用鼠標白色立方體紅色立方體碰撞紅色立方體保持靜止用戶繼續拖動白色立方體。。。用戶仍然拖動白色立方體,其可沿平面的表面上移動,但不能在紅色立方體的方向(因爲紅色立方體是應該直接接地)。用戶停止拖動。相同的行爲預期如果用戶開始拖動紅色立方體。 – ExplodingTiger

回答

3

您是否嘗試過放置物理材料和tweek設置(特別是摩擦設置)? 如果你做了,並沒有達到你想要什麼,你可以使用MonoBehaviour.OnCollisionExit檢測當你的對象是不接觸了,要麼set the velocity to 0lock the position。如果你鎖定了位置,你可能需要一段協程來稍後解鎖它。 此解決方案可能會導致以後出現奇怪的錯誤(例如,如果運動不穩,例如,對象僅在一幀中失去聯繫)。如果可能,我寧願使用物理材料。

0

可能不是最好的解決方案,但也許嘗試在碰撞後嘗試摧毀剛體元件,這樣一來,立方體就會變成一個靜態物體,從而變成一堵牆。之後不久可以再添加剛體。