RigidBody2D冻结X位置

时间:2014-03-22 14:41:00

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

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

rigidbody.constraints = RigidbodyConstraints.FreezePositionX;

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

2 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

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

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

答案 1 :(得分:0)

这是我在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<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;
        }
    }
}