【问题标题】:Stop rigidbodies from moving after colliding碰撞后阻止刚体移动
【发布时间】:2016-01-16 09:35:06
【问题描述】:

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

每个立方体都有一个碰撞体和刚体,以及一个反弹为零的高摩擦材料。

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

我得到的是这样的:

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

感谢任何帮助。谢谢。

【问题讨论】:

  • 你试过锁定刚体上的位置吗?您可以在检查器中执行此操作:)
  • 感谢您的意见,@Tom。是的,我确实尝试将 X 和 Z 添加到检查器中的刚体冻结位置约束,但是这样做,我用鼠标移动立方体的脚本将无法正常工作。 :(
  • @JoeBlow - 很抱歉不清楚。我将尝试更好地解释:用户开始用鼠标拖动白色立方体。白色立方体与红色立方体碰撞。红色立方体保持静止。用户继续拖动白色立方体。用户仍在拖动白色立方体,它可以沿着平面的表面移动,但不能沿红色立方体的方向移动(因为红色立方体应该是牢固接地的)。用户停止拖动。如果用户开始拖动红色立方体,则会出现相同的行为。

标签: c# unity3d collision


【解决方案1】:

您是否尝试过放置物理材料并调整设置(尤其是摩擦设置)? 如果你这样做了,但没有达到你想要的,你可以使用MonoBehaviour.OnCollisionExit 来检测你的对象何时不再接触,或者使用set the velocity to 0lock the position。如果你锁定了这个位置,你可能需要一个协程稍后才能解锁它。 此解决方案可能会在以后导致奇怪的错误(例如,在颠簸移动的情况下,您的对象仅在一帧内失去联系)。如果可能的话,我更喜欢使用物理材料。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多