【Unity】2019.2で追加されたTryGetComponentについて
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();
というか、コンポーネントが存在する対象に対するGetComponentが妙に早い気がします。あれ?こんな速度だっけ?