因此,在我的游戏中,有一杆枪可以喷射子弹,而我试图使gameObject在与子弹碰撞时被摧毁。项目符号基于一个gameObject(胶囊)。到目前为止,我已经尝试了以下两个脚本:

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"
    }
}
}


我正在拍摄物体,但它并未消失/破坏。我怎样才能解决这个问题?

如果有帮助,请看以下图片:c# - 用子弹射击时物体未被破坏-UNITY3D C#-LMLPHP

最佳答案

this引用调用方(this is basic OOP)的对象实例,即whenshot,而不是gameObject。因此,第二个示例实际上是从脚本所附加的DestroygameObject脚本实例。

第一个脚本在技术上很好,并且可以满足以下条件:


子弹(子弹)或目标(或两者)都附有非运动刚体组件。 (Unity docs.
两者都具有3D Collider组件。
与目标相撞的每个子弹游戏对象的名称都恰好是“子弹”。
所有弹丸对象都将此脚本作为组件。


一些建议

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

在我看来,以上是您想要的行为。在这种情况下,碰撞与破坏之间不会存在延迟,因此无需模拟任何物理过程。除非您与子弹/目标发生其他物理相互作用,否则将没有刚体的物体标记为触发器。

强烈建议

查看Unity教程。

关于c# - 用子弹射击时物体未被破坏-UNITY3D C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37979818/

10-12 02:47