Mono 在unity3d中创建表格边框

Mono 在unity3d中创建表格边框,mono,unity3d,Mono,Unity3d,我在做一种台球游戏。为了创建表格,我使用了立方体作为边。我想使用内置的物理引擎让这些边与球相互作用。遗憾的是,我无法让它工作 这就是我所做的。我创建了一个立方体作为边,一个球体作为球。要移动球体,我使用rigidbody.MovePosition函数。立方体和球体都连接了碰撞器和刚体,并且关闭了重力 球体移动很好,但当它与立方体碰撞时,会使立方体飞起来。因为立方体应该是一堵不可移动的墙,所以我限制了所有轴的旋转和移动。但是,使用约束会导致物理引擎发疯。球体不再停止运动或朝相反方向移动,而是简单地

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

这就是我所做的。我创建了一个立方体作为边,一个球体作为球。要移动球体,我使用rigidbody.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);
    }

}

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

我建议阅读手册页


更新:

需要考虑的更多事项:

  • 不要检查
    是否触发
  • 检查您的
    层碰撞矩阵
    是否设置正确(菜单编辑/项目设置/物理)
  • 如果速度相当高,物理引擎可能会混淆,并且无法检测到碰撞
  • 确保模型未按比例缩小或放大(最佳比例为1)
  • 刚体的最佳质量。质量
    为1
  • PhysicsManager
    设置时要小心,如
    Min Permission For Pending
    Solver Iteration Count
  • 如果可能的话,使用重力
  • 切勿直接操纵
    变换
    移动。改用
    刚体
    方法
  • 避免在每次更新时调用
    rigidbody.MovePosition
    ,如果它是一个恒定的线性运动。做一次,不要动
  • 记住使用FixeUpdate调用
    rigidbody.MovePosition

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

我建议阅读手册页


更新:

需要考虑的更多事项:

  • 不要检查
    是否触发
  • 检查您的
    层碰撞矩阵
    是否设置正确(菜单编辑/项目设置/物理)
  • 如果速度相当高,物理引擎可能会混淆,并且无法检测到碰撞
  • 确保模型未按比例缩小或放大(最佳比例为1)
  • 刚体的最佳质量。质量
    为1
  • PhysicsManager
    设置时要小心,如
    Min Permission For Pending
    Solver Iteration Count
  • 如果可能的话,使用重力
  • 切勿直接操纵
    变换
    移动。改用
    刚体
    方法
  • 避免在每次更新时调用
    rigidbody.MovePosition
    ,如果它是一个恒定的线性运动。做一次,不要动
  • 记住使用FixeUpdate调用
    rigidbody.MovePosition

哦,这就是我做错的地方。我想,对于碰撞检测,我需要刚体,并不假思索地添加了它们。编辑:没有。同样的情况。球体正好穿过立方体。他们应该会发生碰撞,但有些东西坏了。谢谢你的更新。我仔细检查了触发器和碰撞矩阵。两者都很好。尝试将速度降低到每次更新1个屏幕点,结果相同。我从来没有玩过physicsmanager,所以所有设置都是默认设置。增加重力使球根本不移动。不过我对fixedupdate不太了解。现在,我有默认的更新函数检查输入,并通过moveSpeed*Time.deltaTime移动球。moveSpeed默认为10,因此,从技术上讲,它应该在每次按下按钮时移动10个屏幕点。我正在将代码添加到问题中。另外,我是否应该尝试使用AddForce?这是一款带有曲棍球式移动系统的台球游戏,您可以使用箭头键或拖动鼠标来控制球杆。我是否应该尝试使用AddForce和非常低的标量值移动提示?另外,我对Unity和游戏开发非常陌生。尝试将
moveposition
等的部分从
void Update()
更改为
void fixeupdate()
与fixeupdate的结果相同。我认为在使用时间增量作为标量之后,这并不重要,至少这是我的理解。哦,这是我做错的。我想,对于碰撞检测,我需要刚体,并不假思索地添加了它们。编辑:没有。同样的情况。球体正好穿过立方体。他们应该会发生碰撞,但有些东西坏了。谢谢你的更新。我仔细检查了触发器和碰撞矩阵。两者都很好。尝试将速度降低到每次更新1个屏幕点,结果相同。我从来没有玩过physicsmanager,所以所有设置都是默认设置。增加重力使球根本不移动。不过我对fixedupdate不太了解。现在,我有默认的更新函数检查输入,并通过moveSpeed*Time.deltaTime移动球。moveSpeed默认为10,因此,从技术上讲,它应该在每次按下按钮时移动10个屏幕点。我正在给问题加上密码。还有,应该吗