【问题标题】:Not destroying objects fast enough and causing another collision没有足够快地破坏物体并导致另一次碰撞
【发布时间】:2017-09-16 06:29:20
【问题描述】:

如果子弹击中敌人,而该敌人是敌人身上脚本的一部分,我会检测到:

void OnTriggerEnter (Collider other)
{
    if (other.tag == "Bullet") {
        Destroy (other); // or Destroy (other, 0);
    }
}

问题是当子弹击中敌人时,它的生命值会下降到零(从 100),就好像它被多次击中(我还检查了 Debug.log)。

那么有没有办法让子弹更快地摧毁,这样它就不会再次触发?

另外,这个检测脚本应该在敌人身上还是在子弹上?

【问题讨论】:

  • 使用 Destroy(other.gameObject) 代替 Destroy(other)。 other 只是一个对撞机引用,而不是实际的游戏对象本身。
  • 发布TakeDamage函数。此外,使用Debug.Log 检查调用OnTriggerEnter 的次数。 @deepankar您应该将其发布为答案,因为这可能是问题
  • @Programmer TakeDamage 真的没什么意思,即使我删除了那个调用也会发生同样的情况。我添加了 debug.log,它输入了两次,即使是 Destroy(other.gameObject)
  • 我知道这已经解决了,但是TakeDamage 函数在这里很重要,因为您抱怨分数从 100 降到零。我不知道你为什么要删除它。通过向我们展示我们可以使用排除过程(包括Debug.Log)的功能来找到您的问题。
  • 这是噪音,问题是它输入了两次OnTriggerEnter。 @程序员

标签: unity3d collision-detection collider


【解决方案1】:

使用Destroy(other.gameObject) 代替Destroy(other)。 other 只是一个对撞机引用,而不是实际的游戏对象本身。

也只是为了良好的做法,而不是将标签与 == 进行比较,请使用 other.CompareTag(String tagName)。它的内存消耗更少。

【讨论】:

  • 您是否已将两个对撞机附加到您的子弹对象。或者你确定只有一颗子弹击中了敌人。您可以打印InstanceId,并检查它们是否相同。
  • 使用collider.gameObject.GetInstanceID()获取uniqueId
  • 它有两个对撞机。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 2013-08-05
  • 2016-03-26
  • 1970-01-01
相关资源
最近更新 更多