Unityにおけるオブジェクト検索メソッドの比較
Unityでは、特定の型のオブジェクトを検索するためのメソッドとして、FindFirstObjectByType と FindAnyObjectByType が用意されています。これらは似た目的で利用されますが、内部の挙動や用途に違いがあります。
また、複数のオブジェクトをまとめて取得したい場合は FindObjectsByType を使います。なお、以前よく使われた FindObjectOfType と FindObjectsOfType は、現在(Unity 6.6 / 6000.6系)では非推奨です。

目次
1. FindFirstObjectByType
- 動作内容
指定された型の中で、最初に見つかったアクティブなロード済みオブジェクト(インスタンスIDが最も低いもの)を返します。 - 特性
- 一貫性がある:常に同じ条件で検索するため、結果が安定しています。
- パフォーマンス負荷:内部で全オブジェクトの検査を行うため、頻繁に実行するとパフォーマンスに悪影響を及ぼす可能性があります。
- 利用シーン
主にシングルトンパターンの実装など、「特定の1つのインスタンス」が必要な場合に適しています。 - 非アクティブオブジェクトの扱い
メソッドの引数でFindObjectsInactive.Includeを指定すると、非アクティブなオブジェクトも検索対象に含めることができます。
サンプルコード
// アクティブなオブジェクトのみ検索(デフォルトは除外)
OtherScript instance1 = FindFirstObjectByType<OtherScript>();
// 明示的に非アクティブなオブジェクトを除外して検索
OtherScript instance2 = FindFirstObjectByType<OtherScript>(FindObjectsInactive.Exclude);
// 非アクティブなオブジェクトも含めて検索
OtherScript instance3 = FindFirstObjectByType<OtherScript>(FindObjectsInactive.Include);
2. FindAnyObjectByType
- 動作内容
指定された型のアクティブなロード済みオブジェクトのうち、任意の1つ(毎回異なる可能性がある)を返します。 - 特性
- 高速な処理:一部のオブジェクトだけで良いため、FindFirstObjectByTypeよりも効率的に動作します。
- 結果の一貫性が低い:返されるオブジェクトは毎回変わる可能性があるため、特定のインスタンスが必要な場合には不向きです。
- 利用シーン
特定のオブジェクトに依存せず、任意の1つのインスタンスで十分な場合、またパフォーマンスが重要な場合に有効です。 - 非アクティブオブジェクトの扱い
FindFirstObjectByType同様、引数で非アクティブオブジェクトの検索を制御できます。
サンプルコード
// アクティブなオブジェクトのみ検索(デフォルトは除外)
OtherScript instance1 = FindAnyObjectByType<OtherScript>();
// 明示的に非アクティブなオブジェクトを除外して検索
OtherScript instance2 = FindAnyObjectByType<OtherScript>(FindObjectsInactive.Exclude);
// 非アクティブなオブジェクトも含めて検索
OtherScript instance3 = FindAnyObjectByType<OtherScript>(FindObjectsInactive.Include);
3. 複数のオブジェクトを取得する方法:FindObjectsByType
- 動作内容
シーン内にある指定した型のオブジェクトを、すべて配列として取得します。旧APIのFindObjectsOfTypeに代わる、現在の書き方です。 - 引数で指定できること
FindObjectsInactive:非アクティブなオブジェクトを対象にするか(Exclude=含めない/Include=含める)FindObjectsSortMode:結果を並べ替えるか(None=並べ替えない/InstanceID=インスタンスID順)
- 使いどころと注意点
同じ型のオブジェクトをまとめて処理したいときに使います。順番が不要ならFindObjectsSortMode.Noneを指定すると、不要な並べ替えを省けます(結果の順序には依存しないでください)。シーン内を調べるため、Update の中で毎フレーム呼ぶのは避け、Start などで一度取得して使い回しましょう。
サンプルコード
// アクティブなオブジェクトのみを、並べ替えずにすべて取得(基本の書き方)
OtherScript[] instances =
FindObjectsByType<OtherScript>(
FindObjectsInactive.Exclude,
FindObjectsSortMode.None);
// 非アクティブなオブジェクトも含めて取得
OtherScript[] allInstances =
FindObjectsByType<OtherScript>(
FindObjectsInactive.Include,
FindObjectsSortMode.None);
(旧バージョン)FindObjectOfType / FindObjectsOfType
- 概要
以前のUnityでよく使われていたメソッドです。FindObjectOfType<T>()は最初の1件を、FindObjectsOfType<T>()は複数件を配列で返していました。 - 現在の扱い
どちらもUnity 6では非推奨です。古い記事やプロジェクトで見かけたら、次のように置き換えます。FindObjectOfType<T>()→FindFirstObjectByType<T>()(どれでもよければFindAnyObjectByType<T>())FindObjectsOfType<T>()→FindObjectsByType<T>(FindObjectsInactive.Exclude, FindObjectsSortMode.None)
まとめ
- 特定のインスタンスが必要な場合
→ FindFirstObjectByType を使用。常に同じ条件で検索されるため、結果が安定します。 - 任意のインスタンスで問題なく、パフォーマンスを重視する場合
→ FindAnyObjectByType を使用。高速に検索できますが、結果が毎回変わる可能性があります。 - 複数のオブジェクトをまとめて取得したい場合
→ FindObjectsByType を使用。基本はFindObjectsInactive.ExcludeとFindObjectsSortMode.Noneを指定します。
これらのメソッドは、使用シナリオやパフォーマンスコストを十分に考慮して選択してください。
詳細はUnityの公式ドキュメントで確認できます:
訪問数 1,310 回, 今日の訪問数 1回










ディスカッション
コメント一覧
まだ、コメントがありません