見出し画像

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の個別指導のオンラインレッスンを行っています。

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

いいなと思ったら応援しよう!

ファイブボックス よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!