我的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
没有任何区别。Update()
时将timestep
重置为0
。没有变化。stop
设置为0,结果没有变化。这是有道理的,因为完全跳过了velocity
(顺便说一句,我还检查过Update()
。所以在这一点上,我只有30行代码,我仍然不知道是什么导致了这一点。由于所涉及的物体是静态触发器对撞机和运动刚体对撞机,两者都没有物理材料,因此一旦设置了标志,就不应该使这个物体移动。但它确实会移动。
SimpleController2D.cs
Debug.Log()
答案 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无法将速度重置为零,因此对象将继续以计算的速度移动。