【问题标题】:Collision Layer Matrix and Parent/Child object relationships碰撞层矩阵和父/子对象关系
【发布时间】:2021-09-22 08:23:40
【问题描述】:

经过一些测试,我来到这里,因为在谷歌搜索之后,我无法找到一个直接的答案。

假设我有一个玩家角色,其标签设置为Player,图层设置为Humanoid。我还有一群NPC在进行巡逻、游荡等移动行为。它们的标签设置为NPC,它们的层设置为Humanoid。由于这是一款使用 2D 物理的 2D 游戏,因此我使用了Project Settings 碰撞矩阵来制作它,以便Humanoids 不会相互碰撞。

换句话说,NPC 和玩家角色可以相互穿过,同时尊重重力、力、冲量等……这很好用。我的问题出现在以下情况下:我想要一个 NPC 的孩子 GameObject,它在层 Default 中并且有一个 CircleCollider2D 类型为 Trigger 并且我想检测该碰撞以执行某些操作(例如:显示对话、停止或切换父对象或其他对象的 AI 行为)。

根据我的测试,这似乎不起作用,但我可能做错了什么。所以我的问题是:

  • 如果游戏对象 A 忽略与 X 层的碰撞,如果 C 将忽略与 Y 层中游戏对象 C 的碰撞是 X 层中 GameObject P 的子对象吗?
private void OnCollisionEnter2D(Collision2D other) {
      if (other.gameObject.CompareTag("Player")) {
        Debug.Log("Collided with player");
      }
      
      if (!eventConsumed && other.gameObject.CompareTag("Player")) {
        var draw = Random.Range(0.001f, 1.0f);

        if (draw > 1.0f - eventChance) {
          dialogueEvent.Play();
          dialogueEvent = null;
        }

        eventChance = Mathf.Clamp(eventChance * 1.33f, 0.0f, 1.0f);
      }
    }

【问题讨论】:

  • 你能在子游戏对象中添加一个运动学 Rigidbody2D 并查看它是否有效吗?如果这提出了一个新问题,即孩子与父母发生冲突,那么您可以致电Physics2D.IgnoreCollision
  • 不幸的是,这没有帮助。我添加了带有 FronzenY 的 Rigidbody 并为子对象键入 kinematic,创建了一个名为 HumanoidGFX 的新层,并将 Humanoid Layer 和 Humanoid GFX 层设置为不相互交互;同时允许 HumanoidGFX 与 Player 交互,反之亦然。
  • 如果忽略 Humanoid 层和 GFX 层之间的碰撞,这些层中的 2 个对象应该如何交互?
  • 我希望“玩家层”中的对象在接受与“人形 GFX”的碰撞时忽略“人形层”。 “Humanoid GFX”与“Humanoid”忽略是为了使刚体不会相互反弹。

标签: unity3d


【解决方案1】:

为了检测设置为触发器的物理对撞机是否发生碰撞。您需要使用 OnTriggerEnter2D 函数而不是 OnCollisionEnter2D 函数。

【讨论】:

  • 这行得通。我不敢相信我在这上面浪费了这么多时间。我完全忘记了 OnTriggerEnter2D 的存在。
猜你喜欢
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
相关资源
最近更新 更多