メインコンテンツへスキップ
見出し画像

Unityのコンポーネント管理 | GetComponent・GetComponentInChildren・AddComponent を徹底解説

    ファイブボックス

    Unityでゲームを作っていると、スクリプトから他の機能を操作したい場面がよく出てきます。

    例えば、

    • Rigidbodyを使って物理的に動かす

    • Animatorを使ってアニメーションを切り替える

    • AudioSourceを使って音を鳴らす

    • 自分で作った別のスクリプトを呼び出す

    といった処理です。
    このようなときに使うのが、今回紹介する

    GetComponent

    また、子オブジェクトの機能を取得する

    GetComponentInChildren

    ゲーム中に新しく機能を追加する

    AddComponent

    についても、あわせて解説します。


    コンポーネントとは

    Unityのオブジェクトは、いろいろな「機能」を組み合わせて作られています。
    例えば、Playerというオブジェクトがあるとします。
    そのPlayerには、

    • Transform - 座標、角度、大きさ、親子関係など

    • Rigidbody - 速度、重力、摩擦、抵抗など

    • Collider - 当たり判定、侵入判定など

    • Animator - アニメーションの管理

    • AudioSource - 音の管理

    • 自分で作ったスクリプト - 他のコンポーネントの管理など

    などが付いていることがあります。

    画像

    このような、オブジェクトに付いている機能のことを コンポーネント と呼びます。
    つまり、Unityでは「GameObjectにコンポーネントを追加して、キャラクターやアイテムを作っていく」というイメージです。


    GetComponentとは

    GetComponent は、同じオブジェクトに付いているコンポーネントを取得する命令です。

    例1 : Rigidbody を取得する

    例えば、同じオブジェクトに付いている Rigidbody を取得したい場合は、次のように書きます。

    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
        Rigidbody rb;
    
        void Start()
        {
            rb = GetComponent<Rigidbody>();
        }
    }

    このコードは、
    このスクリプトが付いているオブジェクトから Rigidbody を探して、rb という変数に入れる
    という意味です。

    取得したあとは、次のように使うことができます。

    rb.AddForce(Vector3.up * 5f, ForceMode.Impulse);

    例2 : Animatorを取得する

    GetComponentは、Rigidbody専用ではありません。
    Animatorを取得したい場合は、次のように書きます。

    using UnityEngine;
    
    public class PlayerAnimation : MonoBehaviour
    {
        Animator animator;
    
        void Start()
        {
            animator = GetComponent<Animator>();
        }
    
        void Update()
        {
            animator.SetBool("Run", true);
        }
    }

    GetComponent<Animator>() と書くことで、同じオブジェクトに付いている Animator を取得できます。

    < > の中には、取得したいコンポーネントの種類を書きます。


    例3 : AudioSourceを取得する

    音を鳴らしたいときは、AudioSourceを取得します。

    using UnityEngine;
    
    public class SoundPlayer : MonoBehaviour
    {
        AudioSource audioSource;
    
        void Start()
        {
            audioSource = GetComponent<AudioSource>();
        }
    
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                audioSource.Play();
            }
        }
    }

    この例では、スペースキーを押したときに音を再生しています。

    AudioSourceも、オブジェクトに付いているコンポーネントの一つなので、GetComponentで取得できます。


    例4 : 自分で作ったスクリプトを取得

    GetComponentで取得できるのは、Unityにもともと用意されているコンポーネントだけではありません。
    自分で作ったスクリプトも取得できます。

    例えば、同じオブジェクトに PlayerHP というスクリプトが付いている場合は、次のように取得できます。

    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
        PlayerHP playerHP;
    
        void Start()
        {
            playerHP = GetComponent<PlayerHP>();
        }
    }

    Unityでは、自分で作ったスクリプトもコンポーネントの一つとして扱われます。
    そのため、別のスクリプトから使いたい場合も、GetComponentで取得できます。


    GetComponentInChildrenとは

    GetComponent は上で説明した通り、基本的に同じオブジェクトに付いているコンポーネントを取得します。
    しかし、実際のゲーム制作では、コンポーネントが子オブジェクト側に付いていることもあります。

    例えば、

    • Player本体にスクリプトが付いている

    • 見た目のモデルは子オブジェクトにある

    • Animatorは子オブジェクト側に付いている

    というケースです。
    このようなときに使うのが、

    GetComponentInChildren

    です。

    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
        Animator animator;
    
        void Start()
        {
            animator = GetComponentInChildren<Animator>();
        }
    }

    これは「自分自身と子オブジェクトの中から Animator を探す」という意味です。
    3Dモデルを使う場合や、見た目だけを子オブジェクトに分けている場合によく使います。


    GetComponentInParentとは

    反対に、親オブジェクトに付いているコンポーネントを取得したい場合は、

    GetComponentInParent

    を使います。

    using UnityEngine;
    
    public class DamageCollider : MonoBehaviour
    {
        PlayerController player;
    
        void Start()
        {
            player = GetComponentInParent<PlayerController>();
        }
    }

    これは「自分自身と親オブジェクトの中から PlayerController を探す」という意味です。
    ただし、最初のうちは

    • 同じオブジェクトなら GetComponent

    • 子オブジェクトなら GetComponentInChildren

    • 親オブジェクトなら GetComponentInParent

    と覚えておけば大丈夫です。


    AddComponentとは

    AddComponent は、オブジェクトに新しくコンポーネントを追加する命令です。
    例えば、ゲーム中に AudioSource を追加したい場合は、次のように書きます。

    using UnityEngine;
    
    public class AddSound : MonoBehaviour
    {
        void Start()
        {
            gameObject.AddComponent<AudioSource>();
        }
    }

    これは「このオブジェクトに AudioSource を追加する」という意味です。
    実際のゲーム作成では、コンポーネントはInspectorから追加することが多いです。

    AddComponentは、

    • ゲーム中に必要になった部品を追加したい

    • 生成したオブジェクトに後から機能を追加したい

    • 状況に応じてコンポーネントを付けたい

    という場面で使います。


    毎回GetComponentしない

    GetComponentは便利ですが、使い方には注意が必要です。

    例えば、次のようにUpdateの中で毎回GetComponentを書くのは、あまりおすすめしません。

    void Update()
    {
        GetComponent<Rigidbody>().AddForce(Vector3.up);
    }

    Updateは毎フレーム呼ばれるため、そのたびにRigidbodyを探すことになります。
    基本的には、StartやAwakeで一度だけ取得して、変数に入れて使います。

    using UnityEngine;
    
    public class PlayerController : MonoBehaviour
    {
        Rigidbody rb;
    
        void Start()
        {
            rb = GetComponent<Rigidbody>();
        }
    
        void Update()
        {
            rb.AddForce(Vector3.up);
        }
    }
    

    このようにしておくと、コードも見やすくなります。


    取得できないときの注意点

    GetComponentで指定したコンポーネントが見つからない場合、変数の中身は null になります。

    その状態で使おうとすると、

    NullReferenceException

    というエラーが出ることがあります。

    このエラーが出たときは、まず次の点を確認しましょう。

    • 対象のオブジェクトに、そのコンポーネントが付いているか

    • 子オブジェクトに付いているのに GetComponent を使っていないか

    • スクリプト名や型名を間違えていないか

    • Inspectorで必要な設定が抜けていないか


    今回のまとめ

    今回は、Unityのコンポーネント管理について解説しました。

    ポイントは次の通りです。

    GetComponent
    同じオブジェクトに付いているコンポーネントを取得する
    
    GetComponentInChildren
    子オブジェクトに付いているコンポーネントを取得する
    
    GetComponentInParent
    親オブジェクトに付いているコンポーネントを取得する
    
    AddComponent
    新しくコンポーネントを追加する
    

    Unityでは、GameObjectにいろいろなコンポーネントを追加してゲームを作っていきます。
    そのため、スクリプトからコンポーネントを取得して操作する方法は、とてもよく使います。

    最初は難しく考えすぎず、

    部品を取り出すのが GetComponent
    部品を追加するのが AddComponent

    と覚えておくと分かりやすいです。

    次回は、他のオブジェクトを取得する方法について解説します。

    GameObject.Find、Transform.Find、FindObjectByType、FindWithTag などの違いを整理していきます。


    Unity初心者向けの記事をテーマ別にまとめています。

    ▼ Unity初心者向け記事まとめはこちら


    こちらのマガジン「ミニゲーム作成講座 全8回セット」でもシーンの切り替えなどを活用して、初心者でも知識ゼロから作れるミニゲーム作成講座を紹介しています。

    画像

    ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。

    ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。

     
     
     
    現役プログラマー&講師です。Unity初心者向けに、ゲーム制作やプログラミングをわかりやすく指導しています。個別レッスンの経験をもとに、挫折しにくい教材をお届けします。

    あなたへのおすすめ