Unity:OnCollisionEnter 仅在新条目时触发,但不会在具有相同名称的不同对象上的新条目时触发

Posted

技术标签:

【中文标题】Unity:OnCollisionEnter 仅在新条目时触发,但不会在具有相同名称的不同对象上的新条目时触发【英文标题】:Unity: OnCollisionEnter fires only on NEW entry, but not on NEW entry on different object with same name 【发布时间】:2019-02-07 12:48:34 【问题描述】:

我正在构建一个带有出现框的平台游戏。一旦玩家击中它,盒子就会被渲染。这工作得很好:

public class AppearingBoxes : MonoBehaviour

    public GameObject Block, RageFace;

    bool showBlock = false;

    void Start()
    
        showBlock = false;
    


    void OnCollisionEnter(Collision2D col)
    
        if (col.gameObject.name == "Birdy") 
        
            showBlock = true;
        
    

    void FixedUpdate()
    
        Block.GetComponent<Renderer>().enabled = showBlock;
        RageFace.GetComponent<Renderer>().enabled = showBlock;
    

这个脚本附在所有这些盒子上。每个盒子都是一个单独的盒子,但都具有相同的脚本、属性和名称:

但是问题来了。只有第一个 HIT 会触发一个框。正如你可以想象的那样,玩家跳到那些看不见的盒子上,然后触发他击中的那个。玩家现在向前移动到仍然不可见的其他框并进入那里的碰撞框。然而他们没有出现。我相信这是因为玩家仍然在“相同”的碰撞箱中,即使它是一个不同的预制对象。如果我跳到看不见的平台上,然后又回到它上面(我离开然后重新进入扳机),我降落的盒子会立即出现。

那么,即使玩家之前没有离开过盒子的碰撞箱,我该怎么做才能让盒子在玩家触摸它时立即出现?

谢谢! :)

【问题讨论】:

在您玩游戏时是否已将BlockRageFace 分配给它们对应的gameobjects 为什么你不在 if 语句中将 Renderer 设置为 true 并使用 FixedUpdate?你可以写if (col.gameObject.name == "Birdy") Block.GetComponent&lt;Renderer&gt;().enabled = true 你好,是的,他们当然都被分配了。如果他们没有,无论我是否跳到他们身上,他们都不会出现。但他们确实出现了,但不幸的是只有在第二次进入他们的碰撞箱后才出现。另外,我在fixedUpdate中这样做是因为只是检查碰撞有一点延迟,我这样做了...... 直接启用渲染器导致的延迟通过在以后使用FixedUpdate调用它来消除是没有意义的@^^ 另请注意,使用您的脚本而不更改任何内容 worked for me 具有非常基本的设置 BoxCollider2DRigidBody2D(仅用于测试我将一些 AppearingBoxes 分开,其他重叠并使用不同高度)->没问题 【参考方案1】:

尝试将框碰撞器更改为 isTrigger 并改用 OnTriggerEnter2D

或者可能是因为您使用 OnCollisionEnter 而不是 OnCollisionEnter2D ?

【讨论】:

我不认为这只是一个错字,因为OP声称它在第二次进入时可以工作......在你的情况下它根本不起作用 抱歉,我的代码中有错字。 Ofc 它是 OnEnter2D。也将它们更改为触发器并没有改变任何东西:(【参考方案2】:

您的代码有问题。我不知道您是错过了还是错字了,但是您不能将OnCollisionEnterCollision2D 参数一起使用。你的游戏会运行,但它一定会给你这个错误信息:

Script error: OnCollisionEnter
This message parameter has to be of type: Collision
The message will be ignored.

改用OnCollisionEnter2D

 void OnCollisionEnter2D(Collision2D col)

    if (col.gameObject.name == "Birdy") 
    
        showBlock = true;
    

【讨论】:

我不认为这只是一个错字,因为OP声称它在第二次进入时可以工作......在你的情况下它根本不起作用 谢谢,但这只是一个错字。它说Enter2D。否则 Unity 会给我错误:)【参考方案3】:

大家,我确实找到了一个“解决方法”它仍然不能真正解释这个问题,但仍然有效......

我所做的是将每个盒子的 BoxCollider 的大小增加一点点。比玩家站立的实际盒子大 3 个像素。这解决了这个问题,但让我想知道:如果玩家没有“真正”与对撞机发生碰撞,他会摔倒。但他没有。现在对撞机稍微大了一点,一切都被完美地触发了。也许是引擎的错误?

感谢大家的帮助

【讨论】:

【参考方案4】:

他没有摔倒,因为对撞机不是触发器,仅此而已。

【讨论】:

以上是关于Unity:OnCollisionEnter 仅在新条目时触发,但不会在具有相同名称的不同对象上的新条目时触发的主要内容,如果未能解决你的问题,请参考以下文章

Unity 在没有 IsTrigger 的情况下使用 OnCollisionEnter2D 检测碰撞

Unity3d游戏开发unity3D OnTriggerEnter和OnCollisionEnter的一点个人心得(转载)

Unity3d中 OnTriggerEnter(Collider other) 和OnCollisionEnter(Collision other)对比

Unity3d碰撞体刚体OnTriggerEnter和OnCollisionEnter用法与区别

unity3d OncollisionEnter2d检测不到碰撞,而且勾了isTrigger也无法穿过

OncollisionEnter2D 不工作,但 OnTriggerEnter2D 工作正常