使用子弹射击物体时不会被摧毁 - UNITY3D C#

时间:2016-06-22 23:23:24

标签: c# unity3d unity5

所以在我的游戏中,有一把喷射子弹的枪,我试图让一个游戏对象在与子弹碰撞时破坏。子弹基于一个游戏对象(胶囊)。到目前为止我已尝试过这两个脚本:

using UnityEngine;
using System.Collections;

public class whenshot : MonoBehaviour {

void OnCollisionEnter(Collision col)
{
    if (col.gameObject.name == "Bullet")
    {
        Destroy(col.gameObject);
    }
}
}

using UnityEngine;
using System.Collections;

public class whenshot : MonoBehaviour {


void OnCollisionEnter(Collision col)
{
    if (col.gameObject.name == "Bullet")
    {
        Destroy(this); //the difference between the two is that I changed "col.gameObject" to "this"
    }
}
}

我正在拍摄物体,但它并没有消失/摧毁自己。我该如何解决这个问题?

这是一个视觉效果,如果它有帮助:Visual

4 个答案:

答案 0 :(得分:4)

this指的是来电者的对象实例(this is basic OOP),即whenshot,而不是gameObject。因此,第二个示例实际上Destroy来自附加到的gameObject脚本的实例。

第一个脚本在技术上很好,如果符合这些条件,它应该可以工作:

  1. 弹丸(子弹)或目标(或两者)都附有非运动刚体部件。 (Unity docs.
  2. 两者都有3D Collider组件。
  3. 与目标发生碰撞的每个子弹游戏对象的名称完全“子弹”。
  4. 所有射弹对象都将此脚本作为组件。
  5. 一些建议

    使用预制件和标签:将您的子弹原语存储起来并将其存储为预制件。在预制件中添加一个名为“Bullet”的标签。对目标执行相同操作并将其标记为“目标”。将播放器标记为“播放器”。在“gunController”中,设置对子弹预制件的引用,并使其在您使用的任何触发器上实例化子弹。在项目符号的脚本中,使用CompareTag("Target")代替==并销毁目标gameObject和this.gameObject。

    在我看来,上述是你想要的行为。如果是这种情况,碰撞和破坏之间没有延迟,因此无需模拟任何物理。除非您与子弹/目标有其他物理交互,否则请将没有刚体的那个标记为触发器。

    强烈建议

    浏览Unity教程。

答案 1 :(得分:0)

这是我前一段时间制作的2D游戏的一个例子,但我认为这可能有所帮助。

void OnTriggerEnter2D(Collider2D other)
{
    if (other.tag == "Destroyable")
    {
        Destroy(other.gameObject);
    }
}

当玩家多次射击它时,我用它来摧毁某些块,只需将它们切换到3D碰撞器和触发器,但它应该为你做的伎俩(我希望^^)。

编辑:此脚本应附加到您的子弹预制件

答案 2 :(得分:0)

好的,所以我想出来了,这有点奇怪,但显然我让子弹移动得太快了......我不得不放慢速度......#Bullet; ForFor_Force"漂浮到约150f,使其工作。感谢所有回答的人。

答案 3 :(得分:0)

我无法评论,所以我会回答:

你可以让子弹快速移动,只需将碰撞检测设置为连续的动态。

它的成功率接近100%。