播放器与带标签的对象碰撞时消失

时间:2019-12-04 21:36:51

标签: c# unity3d scripting collision

我正在开发一个简单的游戏,目标是帮助玩家使用标签“存在”来捕获特定对象。

在处理完模型和动画之后,我现在正在处理碰撞并计算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。

任何有关如何使我的播放机停留在场景中同时删除其他对象并减少计数的指导都值得赞赏。

2 个答案:

答案 0 :(得分:5)

很少。您正在销毁错误的游戏对象:

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()

设置对撞机IsTrigger属性将使用OnTriggerEnter事件,而不再使用OnCollisionEnter

  

在检测到碰撞的第一个物理更新中,   调用OnCollisionEnter函数。在更新过程中,联系方式是   维护后,调用OnCollisionStay,最后调用OnCollisionExit   表示联系已断开。触发对撞机将   类似的OnTriggerEnter,OnTriggerStay和OnTriggerExit函数。

请参见docs

答案 1 :(得分:2)

您当前的对象正在使用非触发对撞机,因此您应该使用OnCollisionEnter。您最好在CompareTag中尝试的OnTriggerEnter呼叫。您应该使用它。

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

void OnCollisionEnter(Collision other)
{
    if (other.gameObject.CompareTag("Present"))
    {
        Destroy(other.gameObject);
        count = count - 1;
        SetCountText();
    }
}