【问题标题】:onTriggerEnter not firing when an AI enters当 AI 进入时 onTriggerEnter 不会触发
【发布时间】:2014-05-28 17:02:30
【问题描述】:

嗨,我正在创建一个项目,其中有玩家或敌人 AI 能够拾取的收藏品,这将增加拾取它的分数并产生新的收藏品。对于我的玩家来说,它工作得很好,但是当我的敌人移动到应该是收藏品的触发对撞机(这是一个使用代码实例化的预制件,如果这会产生影响)时,什么也没有发生。

void OnTriggerEnter(Collider other) {
    Debug.Log ("hihihi");
    if (other.gameObject.tag == "Player") {
        Destroy (gameObject);
        this.gameObject.SetActive(false);
        other.gameObject.SendMessage("spawnNewPage"); 
        GameObject.FindGameObjectWithTag("Start").SendMessage("FindPath");
        other.gameObject.SendMessage("incrementScore"); 
    }
    if (other.gameObject.tag == "Start") {
        Destroy (gameObject);
        this.gameObject.SetActive(false);
        GameObject.FindGameObjectWithTag("Player").SendMessage("spawnNewPage");
        other.gameObject.SendMessage("FindPath"); 
        other.gameObject.SendMessage("incrementScore"); 
    }
}

是我目前在可收藏预制件上的 Picks.cs 上使用的,但它不会为我的敌人触发。播放器是统一的标准 fps 控制器预制件。有什么明显的我想念我的敌人没有任何对撞机或任何东西,但我的 fps 控制器也没有,所以我认为这不是问题。对我所有的标签进行了双重和三重检查,因此任何提示将不胜感激。

【问题讨论】:

  • 在我的敌方坦克上添加了一个角色控制器,最终解决了这个问题,这似乎有点狡猾,但现在它可以工作了
  • 你有刚体组件连接到你的敌人游戏对象吗?
  • 你试过给你的敌人添加一个刚体吗?如果它适用于玩家,您应该比较玩家对象和敌人对象上的内容以找出差异...我 110% 确定您不会使用角色控制器“修复”这个问题...虽然它可能是一个解决方案,我认为它不是正确的。
  • 比较玩家对象是我为它附加角色控制器的原因。我发现它没有与我最初在物体上拥有的刚体碰撞,这很奇怪。当时,它与角色控制器一起工作,但该解决方案很狡猾,足以让我能够继续进行该项目

标签: c# unity3d


【解决方案1】:

有一个表格显示在docs.unity3d.com 上触发碰撞和触发事件的时间。但是他们已经更新了网站,现在我找不到了。我还是本地的。所以,就是这样。

碰撞动作矩阵

根据两个碰撞对象的配置,可能会发生许多不同的动作。下面的图表根据附加到它们的组件,概述了您对两个碰撞对象的期望。某些组合只会导致两个对象之一受到碰撞影响,因此请牢记标准规则 - 物理不会应用于未附加刚体的对象。

发生碰撞检测并在碰撞时发送消息

╔═══════════╦══════════╤═══════════╤═══════════╤══ ════════╤═══════════╤═══════════╗ ║ ║ 静态 │ 刚体 │ 运动学 │ 静态 │ 刚体 │ 运动学 ║ ║ ║ Collider │ Collider │ Rigidbody │ Trigger │ Trigger │ Rigidbody ║ ║ ║ │ │ 对撞机 │ 对撞机 │ 对撞机 │ 触发器 ║ ║ ║ │ │ │ │ 对撞机 ║ ╠═══════════╬══════════╪═══════════╪═══════════╪══ ════════╪═══════════╪═══════════╣ ║ 静态 ║ │ Y │ │ │ │ ║ ║ 对撞机 ║ │ │ │ │ ║ ╟────────────╫──────────┼────────────┼────────────┼── ────────┼────────────┼────────────╢ ║ 刚体 ║ Y │ Y │ Y │ │ │ ║ ║ 对撞机 ║ │ │ │ │ ║ ╟────────────╫──────────┼────────────┼────────────┼── ────────┼────────────┼────────────╢ ║ 运动学 ║ │ Y │ │ │ │ ║ ║ 刚体 ║ │ │ │ │ │ ║ ║ 对撞机 ║ │ │ │ │ ║ ╟────────────╫──────────┼────────────┼────────────┼── ────────┼────────────┼────────────╢ ║ 静态 ║ │ │ │ │ ║ ║ 触发 ║ │ │ │ │ ║ ║ 对撞机 ║ │ │ │ │ ║ ╟────────────╫──────────┼────────────┼────────────┼── ────────┼────────────┼────────────╢ ║ 刚体 ║ │ │ │ │ │ ║ ║ 触发 ║ │ │ │ │ ║ ║ 对撞机 ║ │ │ │ │ ║ ╟────────────╫──────────┼────────────┼────────────┼── ────────┼────────────┼────────────╢ ║ 运动学 ║ │ │ │ │ │ ║ ║ 刚体 ║ │ │ │ │ │ ║ ║ 触发 ║ │ │ │ │ ║ ║ 对撞机 ║ │ │ │ │ ║ ╚═══════════╩══════════╧═══════════╧═══════════╧══ ════════╧═══════════╧═══════════╝

在碰撞时发送触发消息

╔═══════════╦══════════╤═══════════╤═══════════╤══ ════════╤═══════════╤═══════════╗ ║ ║ 静态 │ 刚体 │ 运动学 │ 静态 │ 刚体 │ 运动学 ║ ║ ║ Collider │ Collider │ Rigidbody │ Trigger │ Trigger │ Rigidbody ║ ║ ║ │ │ 对撞机 │ 对撞机 │ 对撞机 │ 触发器 ║ ║ ║ │ │ │ │ 对撞机 ║ ╠═══════════╬══════════╪═══════════╪═══════════╪══ ════════╪═══════════╪═══════════╣ ║ 静态 ║ │ │ │ Y │ Y ║ ║ 对撞机 ║ │ │ │ │ ║ ╟────────────╫──────────┼────────────┼────────────┼── ────────┼────────────┼────────────╢ ║ 刚体 ║ │ │ │ Y │ Y │ Y ║ ║ 对撞机 ║ │ │ │ │ ║ ╟────────────╫──────────┼────────────┼────────────┼── ────────┼────────────┼────────────╢ ║ 运动学 ║ │ │ │ │ │ ║ ║ 刚体 ║ │ │ │ Y │ Y │ Y ║ ║ 对撞机 ║ │ │ │ │ ║ ╟────────────╫──────────┼────────────┼────────────┼── ────────┼────────────┼────────────╢ ║ 静态 ║ │ │ │ │ ║ ║ 触发器 ║ │ Y │ Y │ │ Y │ Y ║ ║ 对撞机 ║ │ │ │ │ ║ ╟────────────╫──────────┼────────────┼────────────┼── ────────┼────────────┼────────────╢ ║ 刚体 ║ │ │ │ │ │ ║ ║ 触发器 ║ Y │ Y │ Y │ Y │ Y │ Y ║ ║ 对撞机 ║ │ │ │ │ ║ ╟────────────╫──────────┼────────────┼────────────┼── ────────┼────────────┼────────────╢ ║ 运动学 ║ │ │ │ │ │ ║ ║ 刚体 ║ Y │ Y │ Y │ Y │ Y │ Y ║ ║ 触发 ║ │ │ │ │ ║ ║ 对撞机 ║ │ │ │ │ ║ ╚═══════════╩══════════╧═══════════╧═══════════╧══ ════════╧═══════════╧═══════════╝

基于层的碰撞检测

在 Unity 3.x 中,我们引入了一种称为基于层的碰撞检测的功能,您现在可以有选择地告诉 Unity 游戏对象与它们附加到的特定层发生碰撞。更多信息请点击here

【讨论】:

    【解决方案2】:

    我认为 cmets 和其他答案都是正确的。您可能想要为您的 AI 添加一个刚体,但如果您想要一个自定义解决方案(例如收藏品只能由玩家和 AI 触发),您可以向您的 AI 添加一个特定层并设置收藏品的对撞机以考虑碰撞仅适用于播放器和“自定义层”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      相关资源
      最近更新 更多