2017-01-25 9 views
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); 
    } 
} 

を、私はnull参照の例外を取得します。 (他のオブジェクトは.parentを必要とせず、Playerコンポーネントを持っていません...)

エラーメッセージを受け取らずにこれらのアイテムを検出することで、この問題を回避したいと思います。私は "// else"の前に何かを書いて、次のステートメント(if)に自分のプレイヤーしかいないようにしたいと思います。私はタグやいくつかの方法で試しましたが、動作させることはできません。

答えて

3

一般的な解決策は、オブジェクトを識別するためにタグを使用することです。したがって、GetComponent()を試す前に、それらの内容を知ることができます。これにより、処理時間が節約され、存在しないコンポーネントを使用しようとする可能性のあるエラーを回避できます。例えば

、あなたがタグを使用して、プレイヤオブジェクト階層「プレーヤー」でトップレベルのゲームオブジェクトにタグを付ける場合は、書くことができます:

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()は実行されません。

希望すると便利です。ご質問がある場合はお知らせください。

+0

ご返信いただきありがとうございます。 私は試しましたが、私はエラーがあります: 安全ゾーンの他のオブジェクトは受け入れません: ".parent"しかし、私は自分のプレーヤーを検出するために必要です。 NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません SafeZone.OnTriggerEnter(Assets/My Assets/Scripts/SafeZone.cs:60) –

+0

@mad_maskプレイヤーオブジェクトのシーン階層を質問に追加しますか?それは、あなたが物事をどのように設定したのか、私にはっきりとわかるはずです。 (大抵、同じレベルではなく 'Player'コンポーネントの下にあなたのコライダーを置いたのだろうかと思っています) – Serlite

+0

@mad_mask私の答えは前提に基づいて編集されています。 – Serlite