碰撞后停止刚体移动

Stop rigidbodies from moving after colliding

我有一个很简单的案例:一个平面上有2个立方体,玩家可以通过鼠标输入来移动一个立方体。

每个立方体都有一个碰撞体和刚体,以及一个高摩擦力 material 和 0 反弹。

我想要实现的是:如果一个立方体要与另一个立方体接触,我想阻止两个立方体相互推动或进入彼此 - 我希望它们充当彼此的墙.

我得到的是:

我试过在拖动立方体时打开它们的 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;
}

感谢任何帮助。谢谢

您是否尝试过放置物理 material 并调整设置(尤其是摩擦设置)? 如果你这样做了,但没有达到你想要的,你可以使用 MonoBehaviour.OnCollisionExit to detect when your objects aren't in contact anymore and either set the velocity to 0 or lock the position。如果您锁定位置,您可能需要一个协程来稍后解锁它。 此解决方案以后可能会导致奇怪的错误(例如,在颠簸移动的情况下,您的对象仅在一帧内失去联系)。如果可能的话,我更愿意使用物理material。

可能不是最好的解决方案,但可以尝试在碰撞进入后破坏刚体组件,这样立方体将成为静态物体,从而变成墙。您可以稍后再次添加刚体。