我有一个安全区,碰撞器通过发送事件消息检测我的玩家是否在里面。但是安全区内还有很多其他物体。
为了检测我的播放器是否在里面,我使用:
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”之前写一些东西,只在下一个语句中使用我的播放器(if)。我尝试使用标签和许多方法,但无法让它们起作用。
答案 0 :(得分:3)
这里的一个常见解决方案是使用标记来标识您的对象,因此在您尝试GetComponent()
之前就知道它们是什么。这样可以节省处理时间并避免尝试使用不存在的组件时出现的错误。
例如,如果使用标记&#34; Player&#34;标记播放器对象层次结构中的顶级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()
赢了&# 39;执行。
希望这有帮助!如果您有任何问题,请告诉我。