2013-02-19 145 views
1

我正在进行各种游戏池游戏。为了创建表格,我使用了立方体作为边。我想使用内置的物理引擎来让这些边与球交互。可悲的是我无法让它工作。unity3d创建表格边框

这是我所做的。我创建了立方体作为一面,并创建了一个球体。为了移动球体,我使用了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

最简单的方法是,他们都应该是固定的,从所有多维数据集删除Rigidbody。另一种方法是将多维数据集的Rigidbody组件标记为Kinematic,但这意味着用于移动应该参与物理但不应被引擎移动的物体,如玩家角色。

我推荐阅读Unity Physics手册页。


更新:

更多的事情要考虑:

  • 不检查Is Trigger
  • 检查您的Layer Collision Matrix设置正确(菜单编辑/项目设置/物理)
  • 如果速度相当高,物理引擎可能会感到困惑和co llision未检测
  • 确保模型不是按比例向上或向下极(最好是有规模= 1)
  • Rigidbody.mass最好的质量为1
  • PhysicsManager设置这样打下去Min Penetration For Penalty或时要小心Solver Iteration Count
  • 尽可能使用重力
  • 不要通过直接操作Transform来移动。使用Rigidbody方法代替
  • 如果每次更新都是恒定线性运动,请避免调用rigidbody.MovePosition。做一次,让它原封不动
  • 记住使用FixedUpdate调用rigidbody.MovePosition
+0

哦,那是我做错了什么。想到碰撞检测,我会需要刚体,并且不加思索地添加它们。 编辑:不。同样的情况。球体正好穿过立方体。他们应该碰撞,但有些事情是关闭的。 – jitendragarg 2013-02-19 17:30:25

+0

@jitendragarg查看我的更新 – Kay 2013-02-19 17:57:00

+0

感谢您的更新。我加倍检查触发和碰撞矩阵。两者都很好。尝试将速度降低到每更新1个屏幕点,结果相同。我从来没有玩过物理管理员,所以所有设置都是默认设置。增加重力使球不能移动。 虽然我对fixedupdate没有太多的想法。截至目前,我有默认的更新功能检查输入,并通过moveSpeed * Time.deltaTime移动球。 moveSpeed默认为10,所以在技术上它应该在每次按下按钮时移动10个屏幕点。我将代码添加到问题中。 – jitendragarg 2013-02-20 11:10:14