[英]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.