はじめに
この記事はHamster Output Advent Calendar 2025の2日目の記事です。
ウェブで参考にしたソースコードをUnity6の環境に持ってきた際に、FindObjectOftypeは旧型式なので書き直してください。という注意書きに遭遇しました。
今回は、注意書きの解決方法とFindObjectsOftype、FindObjectbytypeについて調べたいと思います。
参考リンク
・Unity公式のFindObjectsBytypeの動画
注意書きが出る原因
Unityのバージョンが2020.3.4, 2021.3.18, 2022.2.5, 2022.3 LTS辺りからFindObjectsOftypeの使用を非推奨にしているらしく、注意書き+実行時に警告文のログ表示が起こるみたいです。
将来的にFindObjectsOftypeは廃止されてエラーを出すようになるみたいなので、Unityのバージョンが上記以降の方は書き換えた方が安全です...!
注意書きの解決方法
注意書きの解決方法はFindObjectsOftypeの代わりに、FindObjectsBytypeを使うと表示されなくなります。
// 指定した型を取得してリストにして返してくれる
var tests = FindObjectsByType<T>(FindObjectsSortMode.None)
// 上以外にも下の方法でも解決できる
var anyTest = FindAnyObjectByType<T>();
var firstTest = FindFirstObjectByType<T>();
FindObjectsOftypeがやっていること
ここから先はFindObjectsOftypeが何をやっているのか気になったので調べたことを書いた内容になります。
Object.FindObjectOfTypeはシーン中に存在する指定された型のオブジェクトを全て列挙する機能らしく、公式ドキュメントの内容をGoogle翻訳すると以下の内容になります。
説明
Type 型のロード済みオブジェクトの一覧を取得します。
アセット(メッシュ、テクスチャ、プレハブなど)は返しません。また、HideFlags.DontSave が設定されているオブジェクトも返しません。これらの制限を回避するには、Resources.FindObjectsOfTypeAll を使用してください。返す物
Object[] 指定された型に一致するオブジェクトの配列。
公式ドキュメントでは、Type型のロード済みオブジェクトと表記されていますが、これはシーン上に配置されたゲームオブジェクトのことを指しています。コードは以下の物となります。
var tests = FindObjectsOfType<T>();
この機能では、HideFlags.DontSaveが設定されたオブジェクト、アセット(メッシュ、テクスチャ、プレハブ)等は返さないとあり、これを取得するにはResources.FindObjectsOfTypeAllを使う必要があります。
また、シーン内の非アクティブなオブジェクトも取得したい場合は引数のincludeInactiveをtrueにすると取得対象に含まれます。
var tests = FindObjectsOfType<T>(true);
FindObjectsOfTypeのパフォーマンス面
コガネブログさんが過去にGameObject.Find 系関数の処理速度の検証結果の記事の結果を参考に、オブジェクトが100個、100,000回テストした際の平均値でFindで0.252738秒、FindObjectOfTypeが5.801984秒で計算した際に約23倍近くの差がありました。
シーン内を全検索していることから実行速度が遅い部分がありそうです。
まとめ
Unityのバージョンが最新よりの方はFindObjectsOftypeではなくFindObjectsBytypeを使用しましょう。(将来的にFindObjectsOftypeが廃止される予定があるらしい)
ただ、FindObjectsBytypeも多様できるほどではないみたいなので難しいところです...