在Unity3D中将子对象保留在父对象

时间:2016-11-07 11:41:59

标签: c# unity3d

我有一个Collider2D在我的2D游戏中制作边框。我在此边框内有另一个Gameobject,用户可以使用虚拟操纵杆向上/向下移动它。

现在我希望将所有孩子保持在此边框内,当用户移动up/down时,他们不会将我的特殊边框设为Collider2D

我之前尝试过这样做,在我的边框顶部和下边使用2 gameobject来获取它们的位置并检查每个子对象,但如果我有更多的对象,这不是一个好主意。

我想做的就像下面的图片

enter image description here

我怎么能这样做?

2 个答案:

答案 0 :(得分:3)

我建议您(在您的代码中)始终检查您的GameObject是否在您的范围内。从那里开始,当它超出界限时,只需停止修改位置。

PolygonCollider2D poly = transform.parent.GetComponent<PolygonCollider2D>();
// Check if the position is inside of the bounds
if (poly.bounds.Contains(transform.position))
{
    // GameObject is inside of the bounds
}
else 
{
    // GameObject is outside of the bounds!
}

一个快速举例说明如何做到这一点:

Vector2 movement;
// Calculate movement here
Vector2 newPosition = transform.position + movement;
PolygonCollider2D poly = transform.parent.GetComponent<PolygonCollider2D>();
if (poly.bounds.Contains(newPosition))
{
    transform.position = newPosition;
}
else 
{
    // ignore
}

修改

因为我们想要获得Bounds.Contain 2DCollider,我们必须检查Vector2的{​​{1}}位置

答案 1 :(得分:2)

您可以使用4个边缘碰撞器而不是一个2D碰撞器作为边框。

这样,如果您的GameObject附加了2D Rigidbody和2D Collider,您可以限制GameObject的移动。

注意

碰撞者不会从内部发生碰撞。