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

2025年3月13日

Unityでは、特定の型のオブジェクトを検索するためのメソッドとして、FindFirstObjectByTypeFindAnyObjectByType が用意されています。これらは似た目的で利用されますが、内部の挙動や用途に違いがあります。

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. 複数のオブジェクトを取得する方法:FindObjectsOfType

  • 動作内容
    シーン内に存在する指定型のオブジェクトをすべて取得します。デフォルトではアクティブなオブジェクトのみが対象ですが、オーバーロードにより非アクティブなオブジェクトも含めることができます。
  • 特性
    • 複数取得:条件に合致する複数のオブジェクトを配列として返すため、一括処理が可能です。
    • パフォーマンスの注意点:シーン内のオブジェクト数が多い場合、全体を走査するため負荷が高くなることがあります。特に更新処理中に頻繁に呼び出すと影響が出るため、使用タイミングに注意してください。
  • 利用シーン
    複数の同型オブジェクトに対して一括で処理を行いたい場合や、条件に合った全オブジェクトを対象にする際に使用します。

サンプルコード

// アクティブなオブジェクトのみを取得(デフォルト)
OtherScript[] instances1 = FindObjectsOfType<OtherScript>();

// 非アクティブなオブジェクトも含めて取得(Unity2020以降のオーバーロード)
OtherScript[] instances2 = FindObjectsOfType<OtherScript>(true);

(旧バージョン)FindObjectOfType

  • 概要
    従来使用されていたメソッドで、シーン内のアクティブなオブジェクトから指定型の最初のインスタンスを返していました。
  • 問題点
    シーン内のオブジェクト数が多い場合、全体を検索するためパフォーマンスに影響が出ることがあり、現在は上記の新メソッドへの移行が推奨されています。

まとめ

  • 特定のインスタンスが必要な場合
    FindFirstObjectByTypeを使用。常に同じ結果が得られるため、信頼性が高い。
  • 任意のインスタンスで問題ない場合、かつパフォーマンスを重視する場合
    FindAnyObjectByTypeを使用。高速に検索できるが、結果が毎回変わる可能性がある。

これらのメソッドは、使用シナリオやパフォーマンスコストを十分に考慮して選択してください。

い場合にはパフォーマンスに影響を与える可能性があります。現在は上記FindFirstObjectByTypeに置き換えが推奨されます

詳細はUnityの公式ドキュメントで確認できます:

Unity

Posted by hidepon