Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

C#辞典

  1. トップページ
  2. C#辞典
  3. GameObject.Find() / GetComponent<T>()

GameObject.Find() / GetComponent<T>()

シーン内のゲームオブジェクトを名前で検索する『GameObject.Find()』と、アタッチされているコンポーネントを取得する『GetComponent<T>()』の使い方です。

構文
using UnityEngine;

// シーン内から名前でゲームオブジェクトを検索します(見つからない場合は null)。
GameObject obj = GameObject.Find(string name);

// タグでゲームオブジェクトを検索します。
GameObject obj = GameObject.FindWithTag(string tag);

// タグで一致するすべてのゲームオブジェクトを取得します。
GameObject[] objs = GameObject.FindGameObjectsWithTag(string tag);

// このゲームオブジェクトにアタッチされているコンポーネントを取得します。
T comp = GetComponent<T>();

// 子オブジェクトも含めて検索します。
T comp = GetComponentInChildren<T>();

// 親オブジェクトも含めて検索します。
T comp = GetComponentInParent<T>();

// コンポーネントを追加します。
T comp = gameObject.AddComponent<T>();
メソッド一覧
メソッド概要
GameObject.Find(name)シーン内のすべてのアクティブなゲームオブジェクトを名前で検索します。非アクティブなオブジェクトは対象外です。
GameObject.FindWithTag(tag)指定したタグを持つゲームオブジェクトを 1 つ返します。複数ある場合はどれかが返されます。
GameObject.FindGameObjectsWithTag(tag)指定したタグを持つすべてのゲームオブジェクトを配列で返します。
GetComponent<T>()このゲームオブジェクトにアタッチされているコンポーネント T を返します。なければ null を返します。
TryGetComponent<T>(out T component)コンポーネントの取得を試みます。見つかれば true、なければ false を返します(Unity 2019.2 以降)。
GetComponentInChildren<T>()子オブジェクト(自身を含む)を深さ優先で検索してコンポーネント T を返します。
gameObject.AddComponent<T>()コンポーネント T をゲームオブジェクトに追加して返します。
サンプルコード
using UnityEngine;

public class FindSample : MonoBehaviour
{
    // Inspector からアサインする方法が最も推奨されます。
    [SerializeField] private GameObject プレイヤー;
    [SerializeField] private Rigidbody2D 自分のRigidbody;

    void Start()
    {
        // GameObject.Find() — シーン内から名前で検索します(Start での使用を推奨)。
        GameObject エネミー = GameObject.Find("Enemy");
        if (エネミー != null)
        {
            Debug.Log($"エネミー発見: {エネミー.transform.position}");
        }

        // FindWithTag() — タグで検索します(Find() より高速です)。
        GameObject カメラ = GameObject.FindWithTag("MainCamera");
        if (カメラ != null)
        {
            Debug.Log($"メインカメラ: {カメラ.name}");
        }

        // GetComponent<>() — コンポーネントを取得します。
        Rigidbody rb = GetComponent<Rigidbody>();
        if (rb != null)
        {
            rb.AddForce(Vector3.up * 10f);
        }

        // TryGetComponent — null チェックを省略できます(推奨)。
        if (TryGetComponent<Animator>(out Animator anim))
        {
            anim.SetTrigger("Jump");
        }

        // GetComponentInChildren — 子オブジェクトから検索します。
        AudioSource 効果音 = GetComponentInChildren<AudioSource>();
        if (効果音 != null)
        {
            効果音.Play();
        }

        // タグで複数オブジェクトを取得します。
        GameObject[] コイン一覧 = GameObject.FindGameObjectsWithTag("Coin");
        Debug.Log($"コインの数: {コイン一覧.Length}");
    }
}
概要

『GameObject.Find()』はシーン全体を走査するため、毎フレーム呼ばれる Update() で使用するとパフォーマンスが大幅に低下します。Start()Awake() で一度だけ呼び出して変数にキャッシュしてください。可能な限り Inspector で直接アサインする方法を優先してください。

『GetComponent<T>()』で取得したコンポーネントが null の場合にアクセスすると NullReferenceException が発生します。必ず null チェックを行うか、『TryGetComponent<T>()』を使用してください。デバッグ出力についてはDebug.Log()を、Unity の数学関数についてはMathfをご確認ください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。