Unityにおけるオブジェクト検索メソッドの比較

2026年9月21日

広告

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回

広告

Unity

Posted by hidepon