【Unity】FindFirstObjectByTypeとFindAnyObjectByTypeの違い

両方ともUnityで特定のタイプのオブジェクトを検索するためのメソッドです
ここでは、それぞれの内部構成から追加わけを見ていきましょう

使い分け

これまでFindObjectByTypeメソッド(旧バージョン)を使っていたところには、FindAnyObjectByTypeを使えば良いでしょう

FindFirstObjectByType

このメソッドは、指定されたタイプの最初に見つかったアクティブなロードされたオブジェクトを返します。特に、オブジェクトのインスタンスIDが最も低いオブジェクトを返すため、一貫性がありますが、この関数は非常にリソースを消費するため、毎フレームでの使用は推奨されません。主にシングルトンパターンに使用されることが多いです。

非アクティブなインスタンスを含めない

OtherScript instance = FindFirstObjectByType<OtherScript>();
OtherScript instance = FindFirstObjectByType<OtherScript>(FindObjectsInactive.Exclude);

非アクティブなインスタンスも含める

OtherScript instance = FindFirstObjectByType<OtherScript>(FindObjectsInactive.Include);

FindAnyObjectByType

このメソッドは、指定されたタイプの任意のアクティブなロードされたオブジェクトを返します。返されるオブジェクトは毎回異なる可能性があるため、特定のインスタンスを必要としない場合に適しています。この関数はFindFirstObjectByTypeよりも高速であるため、パフォーマンスが重要な場合に有用です。

非アクティブなインスタンスを含めない

OtherScript instance = FindAnyObjectByType<OtherScript>();
OtherScript instance = FindAnyObjectByType<OtherScript>(FindObjectsInactive.Exclude);

非アクティブなインスタンスも含める

OtherScript instance = FindAnyObjectByType<OtherScript>(FindObjectsInactive.Include);

どちらの関数も使用する際は、そのコストと使用シナリオを考慮することが重要です。特定のオブジェクトの最初のインスタンスが必要な場合はFindFirstObjectByTypeを、どのインスタンスでも問題ない場合はFindAnyObjectByTypeを選択すると良いでしょう。

(旧バージョン)FindObjectOfType

このメソッドは、指定された型のオブジェクトの中で、アクティブなシーン上の最初に見つかったインスタンスを返します。具体的には、シーン内のすべてのアクティブなオブジェクトを調べて、指定された型に一致する最初のものを見つけ出します。このメソッドは使いやすい一方で、シーン内のオブジェクト数が多い場合にはパフォーマンスに影響を与える可能性があります。現在は上記FindFirstObjectByTypeに置き換えが推奨されます

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

Unity

Posted by hidepon