

親オブジェクトに以下のようなスクリプトを置いて、子オブジェクトのRendererコンポーネントを取得したいと思いました。  
しかし、子オブジェクトすべてがRendererコンポーネントを保持しているわけではないので、MissingComponentExceptionが出てしまいました。

[code]

    void GetMaterial(GameObject gameobject)
    {
    
        if (gameObject.GetComponent<Renderer>()?.material != null)
        {
            _materials.Add(gameObject.GetComponent<Renderer>().material);
        }
    
        foreach (Transform child in gameObject.GetComponents<Transform>())
        {
            GetMaterial(child.gameObject);
        }
    }
    
[/code]

どのようにしたらRendererコンポーネントを持っているオブジェクトだけを対象とし、エラーの出ない実装にできるでしょうか。  
回答よろしくお願いします。


CC BY-SA 4.0
2018-09-11T16:56:19.153
48288
2018-09-13T04:00:35.227
2018-09-11T16:58:57.360
19110
30066
question
c# unity3d
子オブジェクトの保持していないコンポーネントの取得について


UnityのエディターではGetComponentの結果はフェイクnullです。  
フェイクnullは比較オペレーターをオーバーロードしたことで、実はnullじゃないです。  
それから、エディターでNullReferenceExceptionの代わりにMissingComponentExceptionが出ることができます。  
nullオペレーターは==や!=オペレーターと違います。オーバーロードができないです。

[code]

    void GetMaterial(GameObject gameobject)
    {
        var renderer = gameObject.GetComponent<Renderer>();
    
        if (renderer != null && renderer.material != null)
        {
            _materials.Add(renderer.material);
        }
    
        foreach (Transform child in gameObject.transform)
        {
            GetMaterial(child.gameObject);
        }
    }
    
[/code]

日本語で説明は大変ですね。


CC BY-SA 4.0
2018-09-13T04:00:35.227
48352
2018-09-13T04:00:35.227
30092
48288
answer