1

我正在做一个各种各样的台球游戏。为了创建一个表格,我使用立方体作为边。我想使用内置的物理引擎让这些边与球互动。可悲的是我无法让它工作。

这是我所做的。我创建了立方体作为侧面,并创建了一个球体作为球体。为了移动球体,我使用了刚体.MovePosition 函数。立方体和球体都附加了碰撞器和刚体,并关闭了重力。

球体运动很好,但是当它与立方体碰撞时,它会使立方体飞起来。由于立方体应该是一堵不可移​​动的墙,我限制了所有轴的旋转和移动。但是,使用约束会导致物理引擎变得疯狂。它没有停止球体或向相反方向移动,而是简单地穿过立方体。显然,出了点问题,我需要帮助找出问题所在。

提前致谢。

这是用于移动球体的代码。

public float movePower = 10.0f;

// Update is called once per frame
void Update () 
{
    if(Input.GetKey(KeyCode.LeftArrow))
    {
        rigidbody.MovePosition(transform.position + Vector3.left* movePower * Time.deltaTime);
    }
    if(Input.GetKey(KeyCode.RightArrow))
    {
        rigidbody.MovePosition(transform.position + Vector3.right* movePower * Time.deltaTime);
    }
    if(Input.GetKey(KeyCode.DownArrow))
    {
        rigidbody.MovePosition(transform.position + Vector3.down* movePower * Time.deltaTime);
    }
    if(Input.GetKey(KeyCode.UpArrow))
    {
        rigidbody.MovePosition(transform.position + Vector3.up* movePower * Time.deltaTime);
    }

}
4

1 回答 1

1

最简单的方法是Rigidbody从所有立方体中删除它们,因为它们应该是固定的。另一种方法是将立方体的Rigidbody组件标记为Kinematic,但这意味着用于移动对象,例如应该参与物理但不应该被引擎移动的玩家角色。

我建议阅读Unity Physics手册页。


更新:

更多需要考虑的事项:

  • 不要检查Is Trigger
  • 检查您Layer Collision Matrix的设置是否正确(菜单编辑/项目设置/物理)
  • 如果速度非常高,物理引擎可能会混淆并且无法检测到碰撞
  • 确保模型不会过度缩小或放大(最好是比例 = 1)
  • 最佳质量为Rigidbody.mass1
  • PhysicsManager玩设置时要小心,例如Min Penetration For PenaltySolver Iteration Count
  • 尽可能使用重力
  • 切勿通过Transform直接操作来移动。改用Rigidbody方法
  • rigidbody.MovePosition如果它是恒定的线性运动,请避免调用每次更新。做一次,保持不变
  • 请记住使用 FixedUpdate 进行调用rigidbody.MovePosition等。
于 2013-02-19T16:11:39.037 回答