C# 在碰撞检测期间区分玩家和其他对象碰撞器

C# 在碰撞检测期间区分玩家和其他对象碰撞器,c#,unity3d,collision-detection,unity5,collider,C#,Unity3d,Collision Detection,Unity5,Collider,我有一个安全区,碰撞器通过发送事件消息来检测我的玩家是否在里面。但安全区内还有很多其他物体 要检测我的播放器是否在里面,我使用: void Start() { if (player == null) { player = GameObject.Find("Gringan").GetComponent<Player>(); Debug.Log("player = " + player.name); } } void OnTrig

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

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

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);
    }
}
void Start()
{
if(player==null)
{
player=GameObject.Find(“Gringan”).GetComponent();
Debug.Log(“player=“+player.name”);
}
}
无效对撞机(对撞机其他)
{
//否则。。。
if(other.transform.parent.GetComponent()==player)
{
打印(“与触发器对象检测到碰撞”+播放器名称);
安全=正确;
m_Player.PlayerIsSafe.Send(安全);
}
}
对于安全区内的其他对象,我得到一个空引用异常。(其他对象不需要
.parent
,也没有
播放器
组件…)


我希望通过检测这些项目而不获取错误消息来避免这种情况。我想在“//else”之前写一些东西,以便在下一个语句中只包含我的播放器(如果)。我尝试过使用标记和多种方法,但无法使它们发挥作用。

这里的一个常见解决方案是使用标记来标识对象,以便在尝试对对象执行
GetComponent()
之前知道它们是什么。这样可以节省处理时间,并避免在尝试使用不存在的组件时可能出现的错误

例如,如果您使用标记“player”标记玩家对象层次结构中的顶级游戏对象,您可以编写:

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);
    }
}
void ontriggenter(碰撞器其他)
{
//否则。。。
if(other.transform.root.CompareTag(“播放器”)
&&other.transform.parent.GetComponent()=播放器)
{
打印(“与触发器对象检测到碰撞”+播放器名称);
安全=正确;
m_Player.PlayerIsSafe.Send(安全);
}
}
注意:由于C#中的条件运算符短路,您不需要为比较编写多个嵌套语句-如果
CompareTag()
失败,则后续的
GetComponent()
将不会执行


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

谢谢您的回复和解释。我试过了,但我有个错误:安全区中的其他对象不接受:“.parent”,但我需要它来检测我的玩家。NullReferenceException:Object reference未设置为Object SafeZone.OnTriggerEnter(UnityEngine.Collider other)的实例(位于Assets/My Assets/Scripts/SafeZone.cs:60)@mad_mask-Hmm,能否将玩家对象的场景层次结构图像添加到问题中?这会让我更清楚地了解你是如何安排的。(很大程度上,我想知道为什么你把你的对撞机放在你的
播放器
组件下面,而不是放在同一个级别上。)@mad_mask根据一个假设编辑了我的答案,让我知道它是否适合你@mad_mask谢谢-我认为我的编辑应该可以正常工作,然后-只需将标签放在玩家对象层次结构中的顶级游戏对象上(我猜是格林根吧?),它就可以毫无问题地检测到它。