如何正确应用';if语句';到C#&;中的特定游戏对象标记;团结?
我试图做的是,当我的播放器与标记为障碍物的白色立方体发生碰撞时,应用调试器脚本显示消息“我们遇到了障碍物” 问题是:当我的播放器与地板/平面接触时,它显示“我们撞到了障碍物”,然后播放器继续与实际障碍物碰撞,并重复该消息 白色立方体在inspector中标记为“障碍物”,玩家标记为“玩家”,游戏所在的平面标记为“地板” 在我的源函数中,我确保只包含标记为“障碍物”的标记,并且场景中唯一标记为“障碍物”的是我的障碍物 每当我的玩家接触到地板或任何其他未标记的游戏对象时,它仍然会显示消息 如何修复此问题以仅将此函数应用于unity中的特定标记如何正确应用';if语句';到C#&;中的特定游戏对象标记;团结?,c#,visual-studio,unity3d,if-statement,3d,C#,Visual Studio,Unity3d,If Statement,3d,我试图做的是,当我的播放器与标记为障碍物的白色立方体发生碰撞时,应用调试器脚本显示消息“我们遇到了障碍物” 问题是:当我的播放器与地板/平面接触时,它显示“我们撞到了障碍物”,然后播放器继续与实际障碍物碰撞,并重复该消息 白色立方体在inspector中标记为“障碍物”,玩家标记为“玩家”,游戏所在的平面标记为“地板” 在我的源函数中,我确保只包含标记为“障碍物”的标记,并且场景中唯一标记为“障碍物”的是我的障碍物 每当我的玩家接触到地板或任何其他未标记的游戏对象时,它仍然会显示消息 如何修复此
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;}}
=>完全没有区别(除了你的可能快一毫秒^^^),这是一个好建议。但你的答案不是解决办法,也不是有意的。