2016-01-15 275 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

可能不是最好的解决方案,但也许尝试在碰撞后尝试摧毁刚体元件,这样一来,立方体就会变成一个静态物体,从而变成一堵墙。之后不久可以再添加刚体。