3

我有一个安全区,碰撞器通过发送事件消息来检测我的玩家是否在里面。但是安全区内还有很多其他的物体。

为了检测我的播放器是否在里面,我使用:

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”之前写一些东西,只让我的播放器出现在下一个语句中(如果)。我尝试了标签和许多方法,但无法让它们工作。

4

1 回答 1

3

这里的一个常见解决方案是使用标签来识别您的对象,因此您在尝试使用它们之前就知道它们是什么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()则不会执行后续语句。

希望这可以帮助!如果您有任何问题,请告诉我。

于 2017-01-25T15:08:59.457 回答