Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.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
如何正确应用';if语句';到C#&;中的特定游戏对象标记;团结?_C#_Visual Studio_Unity3d_If Statement_3d - Fatal编程技术网

如何正确应用';if语句';到C#&;中的特定游戏对象标记;团结?

如何正确应用';if语句';到C#&;中的特定游戏对象标记;团结?,c#,visual-studio,unity3d,if-statement,3d,C#,Visual Studio,Unity3d,If Statement,3d,我试图做的是,当我的播放器与标记为障碍物的白色立方体发生碰撞时,应用调试器脚本显示消息“我们遇到了障碍物” 问题是:当我的播放器与地板/平面接触时,它显示“我们撞到了障碍物”,然后播放器继续与实际障碍物碰撞,并重复该消息 白色立方体在inspector中标记为“障碍物”,玩家标记为“玩家”,游戏所在的平面标记为“地板” 在我的源函数中,我确保只包含标记为“障碍物”的标记,并且场景中唯一标记为“障碍物”的是我的障碍物 每当我的玩家接触到地板或任何其他未标记的游戏对象时,它仍然会显示消息 如何修复此

我试图做的是,当我的播放器与标记为障碍物的白色立方体发生碰撞时,应用调试器脚本显示消息“我们遇到了障碍物”

问题是:当我的播放器与地板/平面接触时,它显示“我们撞到了障碍物”,然后播放器继续与实际障碍物碰撞,并重复该消息

白色立方体在inspector中标记为“障碍物”,玩家标记为“玩家”,游戏所在的平面标记为“地板”

在我的源函数中,我确保只包含标记为“障碍物”的标记,并且场景中唯一标记为“障碍物”的是我的障碍物

每当我的玩家接触到地板或任何其他未标记的游戏对象时,它仍然会显示消息

如何修复此问题以仅将此函数应用于unity中的特定标记

using UnityEngine;

public class PlayerCollision : MonoBehaviour
{
    void OnCollisionEnter (Collision collisionInfo) {
        
        if (collisionInfo.gameObject.tag == "Obstacle") {
            Debug.Log("We hit an obstacle");
        }
    }
}
这是我试图将代码应用到的场景,您可以在控制台中看到,当只应该有一条消息时,它读作两条消息,表明我的函数应用于多个游戏对象,而不是我预期的对象。您还可以在检查器的左上角看到,障碍物标记为障碍物

我会尝试做:

if (collisionInfo.collider.tag == "Obstacle")
{
    Debug.Log("We hit an obstacle");
}

使用碰撞器代替游戏对象。另外,我不知道if语句后面是否有分号,或者这只是一个格式错误,但也没有必要这样做。

在Unity中,通常不会比较字符串之类的标记

void OnTriggerEnter(Collider other) 
{
    if (other.gameObject.CompareTag("Obstacle"))
        Destroy(other.gameObject);
        
}
摘自文件:

在您的例子中,它是
collisionInfo.collider.gameObject.CompareTag(“障碍物”)
。您需要保存标签的碰撞器的游戏对象

您还应该考虑将标记名称作为静态字符串放置在静态类中,从中可以访问它们,并消除TyPs的可能性。

public static class TagNames
{
     public static string Obstacle = "Obstacle";
     public static string Player = "Player";
}

然后像这样使用它们
collisionInfo.collider.gameObject.CompareTag(TagNames.障碍)

尝试调试gameObject.name的.Log()。通过这种方式,您可以确定其中一个碰撞是否从地板上触发。正如@SeLeCtRa所建议的:使其
Debug.Log($“我们遇到了一个名为{collisionInfo.gameObject.name}”、collisionInfo.gameObject的障碍物)通过这种方式,您a)可以看到与之碰撞的实际对象的名称,b)可以在控制台中单击一次调试,它将高亮显示场景层次结构中的相应对象。或者,您也可能只按预期命中一个对象,但您可以从脚本的两个不同实例获取日志。因此,如果第一次尝试为两个日志打印相同的内容,并引用相同的命中对象,则将其更改为
Debug.Log($“{name}命中一个名为{collisionInfo.gameObject.name}的障碍,这将导致失败)
现在会额外打印出该脚本附加到的对象的名称,如果您单击它,它会突出显示导致日志的对象,那么没有必要这样做,这可能是问题所在,也可能是错误的,因为主体块将始终被执行。使用分号,
if
语句没有任何作用。我认为这只是StackOverflowNote的复制粘贴问题,
您正在碰撞其碰撞器的游戏对象。
我们碰撞的碰撞器。
。。从:
公共字符串标记{get{return gameObject.tag;}set{gameObject.tag=value;}}
=>完全没有区别(除了你的可能快一毫秒^^^),这是一个好建议。但你的答案不是解决办法,也不是有意的。