我想知道是否有一种方法可以使用 Unity 的 RigidBody2D 来模拟以下代码行,而不是使用普通的 RigidBody。
rigidbody.constraints = RigidbodyConstraints.FreezePositionX;
我希望我的球员 x 位置在与某物碰撞时冻结。虽然我可以使用上述方法,但它需要我重新处理所有 2D 碰撞以处理 3D 碰撞。我宁愿避免的痛苦。
我想知道是否有一种方法可以使用 Unity 的 RigidBody2D 来模拟以下代码行,而不是使用普通的 RigidBody。
rigidbody.constraints = RigidbodyConstraints.FreezePositionX;
我希望我的球员 x 位置在与某物碰撞时冻结。虽然我可以使用上述方法,但它需要我重新处理所有 2D 碰撞以处理 3D 碰撞。我宁愿避免的痛苦。
这是由于使用 Box2D 引擎进行模拟。它不直接提供对刚体本身的约束。然而,它确实提供了关节。
您要查看的是Slider Joint 2D。这将允许您限制特定方向的运动。
默认情况下,它将冻结/约束 X 位置(即您可以向上或向下移动)。通过修改角度,您可以更改允许对象移动的线。
因此,假设您要限制垂直运动。在这种情况下,您添加一个如下所示的滑块关节:
这将允许特定的 2D 刚体仅向上或向下移动。这里有几点需要注意。关节与其他刚体相关,您通常会将其添加到“连接刚体”中。如果不这样做,它将在原点 (0,0) 处隐式设置一个。当您可能没想到时,这将产生将受约束的身体捕捉到那里的效果。这可以通过适当地更改“连接的锚点”设置来修改。
如果你想水平约束你的刚体,你可以像以前一样做,增加一个角度。将其设置为 90 度就可以了。
这如何适合您的特定设置和代码,您必须尝试弄清楚。但为了帮助您,我在 Github 上创建了一个小型演示场景。
它不会做很多事情,但是通过与场景视图中的两个正方形进行交互(尝试将它们沿轴平移),您就会知道它在做什么。
这是我在 Unity2D 中用于将轴锁定在任何对象上的脚本组件。只需附加脚本,从下拉列表中选择一个轴,就可以了。请注意,您的对象当然需要一个刚体 2d 和对撞机才能正常工作。
感谢@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<SliderJoint2D>();
slider.connectedAnchor = new Vector2(transform.position.x, transform.position.y);
slider.collideConnected = true;
if (lockAxis == AxisDirection.x) {
slider.angle = 90;
} else {
slider.angle = 0;
}
}
}