テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unity】2019.2で追加されたTryGetComponentについて

f:id:tsubaki_t1:20190716231235j:plain

Unity 2019.2から、TryGetComponentというAPIが追加されました。何時も通りGetComponentで取得する際、なんか見覚えがないAPIがあってビビったのはここだけの話。

TryGetComponent

今まで「コンポーネントが割り当てられていない状態」を取得する場合、とりあえず GetComponent で取得して中身がNullかどうかを確認するというのが常套手段でした。

            var component = array[i].GetComponent<SampleComponent>();
            if (component != null)
                component.Value++;

TryGetComponentは、戻り値にコンポーネントを取得できたかを確認してくれます。例えば上と同じ動作は、下のように記述出来ます。

            if( TryGetComponent(out SampleComponent comp))
                comp.Value++;

パフォーマンスは?

パフォーマンスですが、GetComponentで取得後にNullチェックするのと大して変わりません。これは「ビルド前後」「取得するコンポーネントの有無」に関わらずです。

試しに下のようなコードで毎フレーム1000個ほどGameObjectを複製してGetComponentした所、こんな結果になりました。エディターでTryGetComponent時に妙に遅いのを除けば、大体想定した感じの動きです。

        SampleComponent comp;

        Profiler.BeginSample("test_TryGetComponent");

        for (int i = 0; i < data.capacity; i++)
        {
            if( TryGetComponent(out  comp))
                comp.Value++;
        }

        Profiler.EndSample();
        Profiler.BeginSample("test_GetComponent");

        for(int i=0; i<data.capacity; i++)
        {
            var component = array[i].GetComponent<SampleComponent>();
            if (component != null)
                component.Value++;
        }

        Profiler.EndSample();

f:id:tsubaki_t1:20190716232530j:plain
コンポーネント有りエディター

f:id:tsubaki_t1:20190716232613j:plain
コンポーネント有りビルド後

f:id:tsubaki_t1:20190716232402j:plain
コンポーネント無しエディター

f:id:tsubaki_t1:20190716232300j:plain
コンポーネント無しビルド後

というか、コンポーネントが存在する対象に対するGetComponentが妙に早い気がします。あれ?こんな速度だっけ?