unityでいってみよう!

unityがチョットワカル位の人のブログ

Object.FindObjectsByTypeをつかってみよう!

まとめ

  • Object.FindObjectsOfType(Type type)の代わりにObject.FindObjectsByType(Type type, FindObjectsSortMode sortMode)を使用すると処理負荷が軽減します。
  • Object.FindObjectsOfType (type)としている箇所をObject.FindObjectsByType(type, FindObjectsSortMode.None)へ置換するだけなので作業コストは小さいものの処理負荷削減の効果があります。
  • 互換性の問題がある部分に関しては、Object.FindObjectsByType(type, FindObjectsSortMode.InstanceID)へ置き換えて下さい。処理負荷はObject.FindObjectsOfType(type)と変わらないですが、Unity2023以降も引き続き使用することが可能です。

詳細

Unity2023.1でAPI Object.FindObjectsByType()が追加されました。 このAPIでは引数としてFindObjectsSortModeが指定できるようになっており、FindObjectsSortMode.Noneを指定すると内部的なソートが行われない為、Object.FindObjectsOfTypeと比較して処理負荷が軽減される効果が期待できます。つまり、Object.FindObjectsOfTypeでは内部的にInstanceID順に並び替えを行っていましたが、ユーザーの視点から考えると不要である為、ソート処理をスキップすることでその分処理負荷が見込めるという訳です。 Object.FindObjectsOfTypeとの互換性を保ちたい場合は、FindObjectsSortMode.InstanceIDを指定することでObject.FindObjectsOfTypeと同様の結果を得ることが出来ます。但し、この引数で得られる結果として既に述べた通り、取得できるオブジェクトがInstanceID順に並んでいるか否かである為、その結果に依存するということはあまり関係ない筈です。 (UnityEditorでもこのAPI(から呼ばれるインターナル関数)を利用しており、そこではInstanceID順で並んでいる必要があった訳です。)

// 置き換える例
#if UNITY_2023_1_OR_NEWER
// meshsの配列の中身は不規則に並んでいる
var meshs = FindObjectsByType(typeof(Mesh),FindObjectsSortMode.None);
#else
// meshsの配列の中身はインスタンスIDでソートされている
var meshs = FindObjectsOfType(typeof(Mesh));
#endif

以上です。
この記事が参考になった方は読者になるボタンを押して頂けますと幸いです。