为什么我的子弹穿过敌人而没有发现碰撞?

时间:2020-08-11 17:38:40

标签: c# unity3d collision-detection

我已经设置了Unity 2D项目,以使子弹可以触发并检测和碰撞但不会与环境交互,而我的敌人是对撞机,因此两者都可以。我不知道它们是两种不同类型的事实是否会影响碰撞,但我想我会包括该细节,以防万一。我知道此问题不是由我的子弹移动太快引起的,因为当我调低子弹的速度时,问题仍然存在。我将在此处包括敌人碰撞和子弹碰撞检测的代码:

void OnCollisionEnter2D (Collision2D coll)
{
    if (coll.gameObject.tag == "Proj") {
        Destroy(gameObject);
        Debug.Log("Hit");
    }

现在要注意:

void OnTriggerEnter2D(Collider2D hitInfo)
{
    if (hitInfo.gameObject.tag == "Enemy") {
    Destroy(gameObject);
    }

子弹正在检测与敌人的碰撞并自行删除,但敌人并未检测到与子弹的碰撞并自行造成伤害/删除。即使关闭了项目符号代码的Destroy(gameObject)部分,以使其在碰撞时也不会破坏自身,我仍然遇到相同的问题,因此我知道在检测到任何东西之前删除它并不是问题。我希望我的解释足够详尽,希望有人可以帮助我解决此问题。 检查员的图像:https://imgur.com/a/TLfcNcp

3 个答案:

答案 0 :(得分:1)

当您从敌人脚本中调用OnCollisionEnter而不是OnTriggerEnter时,子弹必须是非触发对撞机。

答案 1 :(得分:0)

请显示每个对撞机的设置,OnCollisionEnter2DOnTriggerEnter2D也是2种不同的东西,它们会在不同的条件下发生,因此请确保您为播放器使用了正确的设置。 / p>

答案 2 :(得分:0)

我对触发器的行为并不十分熟悉,因为我已经开始使用触发器,已经有一段时间了,但是this bit of documentation for MonoBehaviour.OnTriggerEnter2D(Collider2D)是解决问题的重要起点:

仅当其中一个碰撞器还附加了Rigidbody2D时才发送触发事件。

我不能肯定地说,但是您的屏幕截图显示其中没有Rigidbody2D


有趣的是,

Collider2D.OnTriggerEnter2D(Collider2D)

文档忽略了指定Rigidbody2D是必需的。我不确定这意味着什么; MonoBehaviour.OnTriggerEnter(Collider)Collider.OnTriggerEnter(Collider)(3D类似物)都需要RigidBody。这两个页面也都声称

如果两个GameObjects都启用了Collider.isTrigger,则不会发生碰撞。

但是,Monobehaviour.OnTriggerEnter2D(Collider2D)中的示例代码声称将两个2D对撞机都设置为触发器仍然可以调用该函数。