Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 玩家与标记对象碰撞时消失_C#_Unity3d_Scripting_Collision - Fatal编程技术网

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

C# 玩家与标记对象碰撞时消失,c#,unity3d,scripting,collision,C#,Unity3d,Scripting,Collision,我正在做一个简单的游戏,目标是帮助玩家捕捉带有“礼物”标签的特定物体 在处理完模型、动画之后,我现在正在处理碰撞和计数UI 对于碰撞,在我的播放器控制器上(我使用播放器中的ThirdPersonUserController,这简化了整个动画过程),我添加了以下功能: void OnCollisionEnter(Collision other) { if (other.gameObject.tag == "Present") { Destroy(gameObject

我正在做一个简单的游戏,目标是帮助玩家捕捉带有“礼物”标签的特定物体

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

对于碰撞,在我的播放器控制器上(我使用播放器中的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”的物体时,即使计数正常,玩家也会消失

我已尝试将
OnCollisionCenter
更改为
OnTriggerCenter
,如下所示:

void OnTriggerEnter(Collider other)
{
    if (other.gameObject.CompareTag("Present"))
    {
        Destroy(gameObject);
        count = count - 1;
        SetCountText();
    }
}
但是,当玩家用标签“Present”点击对象时,它们不会消失

我的播放器有一个胶囊对撞机和一个刚体

标记为“Present”的对象具有长方体碰撞器和刚体


关于如何让我的播放器在移除其他对象和减少计数的同时留在场景中的任何指导,我们都非常感谢。

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

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
事件,而不再使用
OnCollisionCenter

在检测到碰撞的第一次物理更新中 调用OnCollisionCenter函数。在更新过程中,联系人 维护后,将调用OnCollisionStay,最后调用OnCollisionExit 表示触点已断开。触发碰撞器调用 类似的OnTiggerEnter、OnTiggerStay和OnTiggerExit函数


请参见

您当前的对象正在使用非触发碰撞器,因此您应该使用
OnCollisionCenter
。最好使用您在
OnTriggerEnter
中尝试的
CompareTag
调用。你应该用这个

此外,您当前正试图销毁
ThirdPersonUserController
所连接的游戏对象(
gameobject
)。相反,用
destroy(other.gameobject)销毁碰撞碰撞器的游戏对象(
other.gameobject


你是否试图用
Destroy(游戏对象)让玩家消失?我试图使该对象在玩家与之碰撞时,标记为“Present”的对象消失。
Destroy(gameObject)与当前游戏对象无关。也许你的意思是使用
Destroy(other.gameObject)?另外,如果您的碰撞器未设置为触发器,则应使用
OnCollisionCenter
,而不是
OnTriggerCenter
,非常感谢您的回答。当Ruzihm帮助我解决评论部分的问题时,我批准了他的回答,尽管你的答案有额外的考虑,也许有用。考虑一下投票,因为它有一个与性能相关的额外考虑。
void OnCollisionEnter(Collision other)
{
    if (other.gameObject.CompareTag("Present"))
    {
        Destroy(other.gameObject);
        count = count - 1;
        SetCountText();
    }
}