我有一个安全区,碰撞器通过发送事件消息检测我的玩家是否在里面。但是安全区内还有很多其他物体。
为了检测我的播放器是否在里面,我使用:
void Start()
{
if (player == null)
{
player = GameObject.Find("Gringan").GetComponent<Player>();
Debug.Log("player = " + player.name);
}
}
void OnTriggerEnter(Collider other)
{
//else ...
if (other.transform.parent.GetComponent<Player>() == player)
{
print("Collision detected with trigger object " + player.name);
safe = true;
m_Player.PlayerIsSafe.Send(safe);
}
}
对于安全区内的其他对象,我得到一个空引用异常。 (其他对象不需要 .parent
并且没有 Player
组件...)
我想通过在不收到错误消息的情况下检测这些项目来避免这种情况。我想在“//else”之前写一些东西,以便在下一个语句(如果)中只包含我的玩家。我尝试了标签和多种方法,但无法让它们发挥作用。
最佳答案
这里一个常见的解决方案是使用标签来识别您的对象,这样您就可以在尝试对它们执行 GetComponent()
之前知道它们是什么。这可以节省您的处理时间并避免您在尝试使用不存在的组件时可能会遇到的错误。
例如,如果您在玩家对象层次结构中使用标签“Player”标记顶级 GameObject,您可以这样写:
void OnTriggerEnter(Collider other)
{
//else ...
if (other.transform.root.CompareTag("Player")
&& other.transform.parent.GetComponent<Player>() == player)
{
print("Collision detected with trigger object " + player.name);
safe = true;
m_Player.PlayerIsSafe.Send(safe);
}
}
注意:由于 C# 中条件运算符的短路,您无需为比较编写多个嵌套语句 - 如果 CompareTag()
失败,后续的 GetComponent ()
不会被执行。
希望对您有所帮助!如果您有任何问题,请告诉我。
关于c# - 在碰撞检测期间区分玩家和其他物体碰撞器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41854493/