碰撞后阻止刚体移动

时间:2016-01-15 13:40:33

标签: c# unity3d collision

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

每个立方体都附有一个对撞机和刚体,以及一个反弹的高摩擦材料。

我想要达到的目标是:如果一个立方体要与另一个立方体接触,我想阻止两个立方体互相推挤或相互进入 - 我希望它们互相作为墙。< / p>

我得到的是:

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;
}

感谢任何帮助。感谢。

2 个答案:

答案 0 :(得分:3)

您是否尝试过放置物理材料并调整设置(尤其是摩擦设置)? &#xA;如果你做了,但没有达到你想要的效果,你可以使用 MonoBehaviour .OnCollisionExit 检测对象何时不再联系,并设置速度为0 锁定位置。如果你锁定了位置,你可能需要一个协程才能解锁它。&#xA;这个解决方案可能会导致以后出现奇怪的错误(例如,如果碰撞不稳定,你的物体只会失去一帧的接触)。如果可能的话,我更喜欢使用物理材料。

&#xA;

答案 1 :(得分:0)

可能不是最佳解决方案,但可能会在碰撞进入后摧毁刚体组件,这样立方体就会变成静止物体,从而变成墙壁。不久之后你可以再次添加刚体。