Unity - 如何从父游戏对象检测子对象的碰撞?

6

我正在使用Unity 5制作2D游戏,但是我遇到了一个子游戏对象碰撞的问题。我想要在父脚本中使用标签检测子游戏对象与另一个对象之间的碰撞。

以下是我的父脚本:

 void OnCollisionEnter2D(Collision2D hit) {

    if(hit.transform.tag == "Enemy"){

        this.playerRigidbody.AddForce(new Vector2(0, this.forceJump));

    }

 }

"敌人"标签是另一个与我的玩家子物体的碰撞器发生碰撞的对象。我想检测子物体和那个对象之间的碰撞,我在许多关于Unity的类似论坛上搜索,但无法解决我的问题。有人可以帮我解决这个问题吗?

2个回答

23
当碰撞发生时,Unity将在层次结构中向上查找最近的刚体(Rigidbody),并运行相同游戏对象上的任何脚本。
因此,简单的方法是确保刚体位于带有脚本的父对象上。以下是一个示例层次结构:
- 父级
- 子A
- 子B
父级具有:
- Rigidbody 2D - 脚本
子B具有:
- Box Collider 2D
当盒形碰撞器与某物发生碰撞时,事件将直接冒泡通过子A并由父级上的刚体接收,然后触发脚本运行。
如果无法将刚体放在父级上...
出于性能原因,Unity不会将事件向上冒泡到更高层次。因此,其他选项为:
- 向子对象添加一个脚本,在那里捕获碰撞并处理它。如果需要,您可以像这样将事件转发给父类脚本:
void OnCollisionEnter2D(Collision2D hit) {

    // Forward to the parent (or just deal with it here).
    // Let's say it has a script called "PlayerCollisionHelper" on it:
    PlayerCollisionHelper parentScript = transform.parent.GetComponent<PlayerCollisionHelper>();

    // Let it know a collision happened:
    parentScript.CollisionFromChild(hit);

}
  • 或者在“另一个”对象上编写脚本,以便从其角度捕获该碰撞事件。

2
非常完整的答案! - utkdub
感谢@LukeBriggs的回答。我的父对象有一个RigidBody2D,这会让代码变得更复杂吗?当我检测到子对象的碰撞时,我会让父对象(玩家)跳跃,这就是为什么我想在父脚本中进行此验证的原因。是否存在一种简单的方法可以在父脚本中检测到子对象的碰撞?再次感谢您的回答。 - Yuri Pires
@YuriPires Rigidbody2D 或 Rigidbody 在复杂性方面没有区别;如果父对象有刚体组件,那么父对象的脚本将会“正常工作” :) - Luke Briggs

0

确保子对象没有刚体,并确保碰撞器属性正确。请查看此文章中的复合碰撞器部分,了解有关在子对象中组合碰撞器的更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接