繁体   English   中英

RigidBody2D冻结X位置

[英]RigidBody2D freeze X position

我想知道是否有一种方法可以使用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<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;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM