【问题标题】:Keep child object inside parent in Unity3D在 Unity3D 中将子对象保留在父对象中
【发布时间】:2016-11-18 20:52:50
【问题描述】:

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

现在我想让所有的孩子都在这个边界内,当用户移动他们up/down时,他们不会进入我的特殊边界,即Collider2D

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

p>

我想做的就像下面的图片

我该怎么做?

【问题讨论】:

  • 我建议你把你的问题说得更清楚:现在很难理解你的目标是什么。考虑添加您已经生成的代码以及您想要实现的屏幕截图或图形表示。
  • @Kardux 我认为问题很清楚,这个问题发生在编码之前,然后我现在没有任何代码。在没有任何东西时,在做任何事情之前,请记住这个问题:)
  • 好吧,既然你说 “我之前尝试过这样做 [...] 这不是一个好主意” 我猜我猜你已经制作了在寻求帮助之前有什么?还提供您所想的快速绘图并不是那么耗时(here 是您可以做的一个示例(不知道我是否正确理解了您的问题))。无论如何,如果我听起来没有帮助,那我很糟糕:我只给了你这个评论,因为这是我在阅读你的问题时的观点。最后我想提供的答案应该足以解决你的问题;)
  • @Kardux 谢谢。我将来会使用你的建议,我在我的问题中使用了你的画。

标签: c# unity3d


【解决方案1】:

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

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
}

编辑:

因为我们试图获取2DColliderBounds.Contain,我们必须检查GameObjectsVector2 位置

【讨论】:

  • 这在我的游戏中不起作用我用 2 个游戏对象对其进行了测试,并让其中一个成为另一个对象的孩子,我给这些对象碰撞器并为它们编写上面的代码,但总是对我有用。这个答案不正确
  • 确实如此,但父级必须有对撞机。
  • 问题在于获得新职位。当我使用 Vector2 测试它以找到它工作的游戏对象的新位置时
  • 这个链接帮我找到了问题看看:answers.unity3d.com/questions/930309/…
【解决方案2】:

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

如果你的 GameObject 有一个 2D Rigidbody 和一个 2D Collider,你可以通过这种方式限制 GameObject 的移动。

注意

碰撞器不会从内部碰撞。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2017-11-23
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多