RigidBody2D冻结X位置

我想知道是否有一种方法可以使用Unity的RigidBody2D模拟以下代码行,而不是使用普通的RigidBody。

rigidbody.constraints = RigidbodyConstraints.FreezePositionX; 

我希望我的球员x位置在碰到某些东西时冻结。 虽然我可以使用上述内容,但我需要将所有2D碰撞重新设计为3D碰撞。 我宁愿避免的痛苦。

这是由于Box2D引擎用来做模拟。 它不直接对刚体本身提供约束。 然而它确实提供关节。

您想要了解的是Slider Joint 2D 。 这将允许您限制特定方向的移动。

默认情况下,它会冻结/约束X位置(即您可以向上或向下移动)。 通过修改角度,您可以更改允许对象移动的直线。

所以,假设你想要垂直约束运动。 在这种情况下,您添加一个如下所示的滑块关节:

这将允许特定的2D刚体仅向上或向下移动。 这里有几点需要注意。 关节适用于其他刚体,通常会添加到“连接的刚体”中。 如果不这样做,它将在原点(0,0)隐式设置一个。 当你可能没想到它时,这会产生将受约束的身体折断在那里的效果。 可以通过适当更改“连接锚点”设置来修改此设置。

如果您希望水平约束您的刚体,您可以像以前一样添加角度。 将它设置为90度就可以了。

这是如何适合您的特定设置和代码,你必须尝试找出。 但为了帮助你,我在Github上创建了一个小型演示场景。

它不会做太多,但通过与场景视图中的两个方块进行交互(尝试沿着轴进行平移),您可以了解它正在做什么。

这是我在Unity2D中使用的脚本组件,用于锁定任何对象上的轴。 只需附加脚本,从下拉列表中选择一个轴,你就应该好好去。 注意你的对象当然需要一个rigidbody2d和collider才能正常工作。

感谢@Bart对Slider Joint 2D如何工作的一个很好的答案。 如果这个脚本没有意义,请看他的答案。

 using UnityEngine; using System.Collections; enum AxisDirection { x, y } [RequireComponent (typeof (SliderJoint2D))] public class AxisLock : MonoBehaviour { [SerializeField] AxisDirection lockAxis; void Awake () { SliderJoint2D slider = GetComponent(); slider.connectedAnchor = new Vector2(transform.position.x, transform.position.y); slider.collideConnected = true; if (lockAxis == AxisDirection.x) { slider.angle = 90; } else { slider.angle = 0; } } }