Kinematic Rigidbody自行移动

时间:2015-07-10 00:16:48

标签: c# unity3d collision-detection rigid-bodies

我的2D Unity游戏中有一个非常奇怪的问题,我能够将其简化为以下核心问题/最小复制测试用例。请按照以下步骤重现(Unity 5.1.1f1):

  • 在位置(0,0,0)创建一个播放器对象(多维数据集)。
  • 删除BoxCollider组件。
  • 附加以下C#脚本,Unity将自动添加所需的组件,从而使其成为刚体对撞机。
  • 设置isKinematic标志。
  • 将另一个多维数据集添加到位置(2,0,0)的场景中。
  • 删除BoxCollider组件并添加BoxCollider2D。这使得这个立方体成为静态对撞机。
  • 设置isTrigger标志。
  • 运行场景。

预期行为:
玩家立方体朝向另一个立方体加速,一旦接触它就停止移动。

观察到的行为:
玩家立方体朝另一个立方体加速,然后继续以恒定速度移动。

其他实施细节:
我最初通过翻译他们的变换来移动所有对象,并且根本不使用Rigidbodies,因为我不需要碰撞检测。现在我这样做,所以我想要Rigidbodies。我潜入了在线资源,发现我应该使用rigidbody.MovePosition()而不是transform.Translate()transform.position。我改变了我的剧本,出现了上述错误 回到transform.position可以解决这个问题,但这不是一个好的解决方案,因为它涉及到不好的做法,根据我的阅读,会产生大量的CPU负载。

尝试解决失败:

  • 切换为Update()Time.deltaTime没有任何区别。
  • 我尝试不在[{1}}中返回,而只是在设置Update()时将timestep重置为0。没有变化。
  • 摆弄Inspector并做一些事情,比如在刚体上冻结位置或将玩家对象设置为触发器根本没有效果。在游戏运行时更改Rigidbody组件上的任何内容(碰撞后)会立即停止多维数据集。字面上的任何东西,甚至将其质量设置为0。
  • 我也尝试将stop设置为0,结果没有变化。这是有道理的,因为完全跳过了velocity(顺便说一句,我还检查过Update()

所以在这一点上,我只有30行代码,我仍然不知道是什么导致了这一点。由于所涉及的物体是静态触发器对撞机和运动刚体对撞机,两者都没有物理材料,因此一旦设置了标志,就不应该使这个物体移动。但它确实会移动。

SimpleController2D.cs

Debug.Log()

1 个答案:

答案 0 :(得分:3)

解决方案

这是Unity 5.1.1f1中的一个错误,已在补丁版本5.1.1p2及更高版本中修复。

在此处获取: http://unity3d.com/unity/qa/patch-releases?version=5.1

发生了什么事?

您甚至可以将问题减少到单个MovePosition电话。 MovePosition使用物理引擎移动对象。因此,Unity计算在下一次物理更新中到达目标位置所需的速度。到达位置后,版本5.1.1f1无法将速度重置为零,因此对象将继续以计算的速度移动。