3

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

rigidbody.constraints = RigidbodyConstraints.FreezePositionX;

我希望我的球员 x 位置在与某物碰撞时冻结。虽然我可以使用上述方法,但它需要我重新处理所有 2D 碰撞以处理 3D 碰撞。我宁愿避免的痛苦。

4

2 回答 2

6

这是由于使用 Box2D 引擎进行模拟。它不直接提供对刚体本身的约束。然而,它确实提供了关节。

您要查看的是Slider Joint 2D。这将允许您限制特定方向的运动。

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

因此,假设您要限制垂直运动。在这种情况下,您添加一个如下所示的滑块关节:

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

如果你想水平约束你的刚体,你可以像以前一样做,增加一个角度。将其设置为 90 度就可以了。

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

它不会做很多事情,但是通过与场景视图中的两个正方形进行交互(尝试将它们沿轴平移),您就会知道它在做什么。

于 2014-03-22T15:47:07.667 回答
0

这是我在 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;
        }
    }
}
于 2014-08-24T07:54:58.680 回答