玩家在与标记对象碰撞时消失

Posted

技术标签:

【中文标题】玩家在与标记对象碰撞时消失【英文标题】:Player disappears when it collides with a tagged object 【发布时间】:2020-03-29 18:50:57 【问题描述】:

我正在开发一个简单的游戏,其目标是帮助玩家捕捉带有“Present”标签的特定对象。

在处理完模型、动画之后,我现在正在处理碰撞和计数 UI。

对于碰撞,在我的播放器控制器上(我使用来自播放器Unity Standard Assets 的 ThirdPersonUserController - 这简化了整个动画过程),我添加了以下功能:

void OnCollisionEnter(Collision other)

    if (other.gameObject.tag == "Present")
    
        Destroy(gameObject);
        count = count - 1;
        SetCountText();
    


void SetCountText()

    countText.text = "Count: " + count.ToString();
    if (count == 0)
    
        winText.text = "Thanks to you the Christmas will be memorable!";
    

但是,像这样,当玩家击中带有“Present”标签的对象时,即使计数正常,玩家也会消失。

我尝试将OnCollisionEnter 更改为OnTriggerEnter,如下所示:

void OnTriggerEnter(Collider other)

    if (other.gameObject.CompareTag("Present"))
    
        Destroy(gameObject);
        count = count - 1;
        SetCountText();
    

但是,当玩家击中带有“Present”标签的对象时,它们并没有消失。

我的玩家有一个胶囊碰撞器和一个刚体。

带有“Present”标签的对象有一个 Box Collider 和一个 Rigidbody。

任何关于如何让我的播放器留在场景中同时移除其他对象和减少计数的指导表示赞赏。

【问题讨论】:

你是想用Destroy(gameObject);让播放器消失吗? 我正在尝试制作对象,当玩家与它发生碰撞时,标签“Present”会消失。 Destroy(gameObject);与现在的GameObject无关。也许您的意思是使用Destroy(other.gameObject);?此外,如果您的对撞机未设置为触发器,您应该使用OnCollisionEnter,而不是OnTriggerEnter 【参考方案1】:

几件事。您正在破坏错误的游戏对象:

void OnCollisionEnter(Collision other)
    
        if (other.gameObject.tag == "Present")
        
            Destroy(gameObject); // this is destroying the current gameobject i.e. the player
            count = count - 1;
            SetCountText();
        
    

更新到:

void OnCollisionEnter(Collision other)
    
        if (other.gameObject.CompareTag("Present"))
        
            Destroy(other.gameObject); // this is destroying the other gameobject
            count = count - 1;
            SetCountText();
        
    

始终使用针对性能进行了优化的CompareTag()

设置 Collider IsTrigger 属性将使用 OnTriggerEnter 事件,而不是 OnCollisionEnter

在检测到碰撞的第一次物理更新中, OnCollisionEnter 函数被调用。在联系人所在的更新期间 维护,调用 OnCollisionStay,最后调用 OnCollisionExit 表示联系已中断。触发对撞机调用 类似的 OnTriggerEnter、OnTriggerStay 和 OnTriggerExit 函数。

见docs

【讨论】:

非常感谢您的回答。由于 Ruzihm 在评论部分帮助我解决了问题,我批准了他的回答,即使您的回答有额外的考虑可能有用。【参考方案2】:

您当前的对象正在使用非触发碰撞器,因此您应该使用OnCollisionEnter。您在OnTriggerEnter 中尝试的CompareTag 呼叫更可取。你应该使用它。

另外,您当前正试图销毁ThirdPersonUserController 附加到的游戏对象(gameObject)。相反,使用Destroy(other.gameObject); 销毁碰撞对撞机(other.gameObject)的游戏对象:

void OnCollisionEnter(Collision other)

    if (other.gameObject.CompareTag("Present"))
    
        Destroy(other.gameObject);
        count = count - 1;
        SetCountText();
    

【讨论】:

也考虑支持this answer,因为它有与性能相关的额外考虑。

以上是关于玩家在与标记对象碰撞时消失的主要内容,如果未能解决你的问题,请参考以下文章

玩家和敌人之间的碰撞错误

如何在与玩家碰撞后让敌人停下来一秒钟?团结[重复]

添加炸弹数量,当玩家碰撞时不起作用

Swift SpriteKit 基本接触/碰撞

2D 对象碰撞 Unity

SpriteKit中精灵之间的碰撞