【Unity】他のゲームオブジェクトのコンポーネントにアクセスする方法

2023年3月30日

Unityで他のゲームオブジェクトのコンポーネントにアクセスする方法はいくつかあります。以下にいくつかの方法を説明します。

さまざまな手順

GetComponentメソッドを使用する

GetComponentメソッドは、指定された型のコンポーネントを持つゲームオブジェクトからコンポーネントを取得するためのものです。例えば、以下のコードでは、名前が"target"であるゲームオブジェクトから、AudioSourceコンポーネントを取得しています。

AudioSource audioSource = GameObject.Find("target").GetComponent<AudioSource>();

GetComponentInChildrenメソッドを使用する

GetComponentInChildrenメソッドは、指定された型のコンポーネントを持つ最初の子孫ゲームオブジェクトからコンポーネントを取得するためのものです。以下のコードでは、名前が"parent"である親のゲームオブジェクトから、AudioSourceコンポーネントを持つ最初の子孫ゲームオブジェクトを取得しています。(親オブジェクトにアタッチされているコンポーネントも取得対象です(後述)

AudioSource audioSource = GameObject.Find("parent").GetComponentInChildren<AudioSource>();

インスペクターから取得する

インスペクターから取得する方法には、2つの主な方法があります

[SerializeField]属性を使用する

[SerializeField]属性を変数に追加することで、インスペクターでその変数にアクセスできます。以下の例では、変数audioSourceがインスペクターで表示されます

using UnityEngine;

public class Example : MonoBehaviour
{
    [SerializeField]
    private AudioSource audioSource;

    // ...
}

public変数を使用する

public変数は、インスペクターからアクセスできます。以下の例では、public変数audioSourceがインスペクターで表示されます

using UnityEngine;

public class Example : MonoBehaviour
{
    public AudioSource audioSource;

    // ...
}

上記の2つの方法の違いは、SerializeField属性を使用すると、private変数でもインスペクターで表示されるため、変数の外部からのアクセスを制限できることです。一方、public変数は、どこからでもアクセス可能であるため、変数を変更することができる可能性があります

以上のように、Unityでは複数の方法で他のゲームオブジェクトのコンポーネントにアクセスすることができます。適切な方法を選択して、必要なコンポーネントにアクセスしてください

検証サンプル

親子関係のゲームオブジェクトを作成して、各オブジェクトにコライダーをアタッチします

親には、BoxCollider、子1にはSphereCollider、子2にはCapsuleColliderをアタッチしています

親にもコンポーネントが存在する場合

配置

テストコード

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Collider collider = GameObject.Find("Parent").GetComponentInChildren<Collider>();
        Debug.Log(collider);
    }
}

結果

GetComponentInChildrenメソッドで、子オブジェクトからのみ取得のように捉われますが、実際は、親のコンポーネントも取得(検索)対象となります

Parent (UnityEngine.BoxCollider)
UnityEngine.Debug:Log (object)
Test:Start () (at Assets/Test.cs:8)

親にはコンポーネントが存在しない場合

配置

テストコード

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Collider collider = GameObject.Find("Parent").GetComponentInChildren<Collider>();
        Debug.Log(collider);
    }
}

結果

親にコンポーネントが存在しない場合、子が取得(検索)対象となります

Child1 (UnityEngine.SphereCollider)
UnityEngine.Debug:Log (object)
Test:Start () (at Assets/Test.cs:8)

親と子孫のゲームオブジェクト全てのコンポーネントを取得したい場合

配置

テストコード

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Collider[] colliders = GameObject.Find("Parent").GetComponentsInChildren<Collider>();

        foreach (var collider in colliders)
        {
            Debug.Log(collider);
        }
    }
}

結果

戻り値は、全ての検索されたコンポーネントの配列になります

Parent (UnityEngine.BoxCollider)
UnityEngine.Debug:Log (object)
Test:Start () (at Assets/Test.cs:11)

Child1 (UnityEngine.SphereCollider)
UnityEngine.Debug:Log (object)
Test:Start () (at Assets/Test.cs:11)

Child2 (UnityEngine.CapsuleCollider)
UnityEngine.Debug:Log (object)
Test:Start () (at Assets/Test.cs:11)

Unity

Posted by hidepon