【Unity】GetComponentとは?コンポーネントを取得するメソッド

GetComponentメソッドとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「UnityのGetComponentってなに?」

「GetComponentを使うとどんなことができるの?」

というお悩みの方に向けた内容となっています。

UnityのGetComponentは、オブジェクトに紐づいているコンポーネントを取得することができるメソッドです。

このGetComponentを使うことで、コンポーネントの中にある変数メソッドを呼び出すことができ、スクリプト上からコンポーネントの機能を使うことができるようになります。

例えば、

  • RigidbodyのAddForceメソッドでオブジェクトに力を加える
  • ColliderをTriggerモードに切り替えて衝突させない
  • オブジェクトが持つ独自のスクリプト内で宣言した変数の値を変える

といったコンポーネントに関する処理を行う場合に、GetComponentを使うことでできるようになります。

そこで、このページでは、UnityのGetComponentがどういったものなのか、特徴や使い方についてまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

GetComponentとは?

ここでは、GetComponentがどういうメソッドなのかについて紹介していきます。

コンポーネントを取得できるメソッド

GetComponentとは、オブジェクトに紐づいているコンポーネントを取得できるメソッドになっています。

そもそもコンポーネントとは、オブジェクトに対して様々な機能を追加できる装備のようなもので、オブジェクトを選択すると紐づいているコンポーネントがインスペクターウィンドウに表示されます。

例えば、

  • オブジェクトの座標や回転を管理するTransform
  • オブジェクトの物理的挙動を表すRigidbody
  • オブジェクトの当たり判定を管理するCollider

などのコンポーネントが、Unityでよく使われています。

GetComponentは、これらのオブジェクトに紐づいているコンポーネントを取得することができるメソッドになっています。

なお、オブジェクトにアタッチされているスクリプトなども、このGetComponentを使うことで取得することができます。

スクリプトからコンポーネント機能を使用・変更できる

GetComponentによってコンポーネントを取得することで、そのコンポーネントの中にある機能を使ったり、データを取得するということができるようになります。

もう少し具体的に言うと、コンポーネントの中には、それぞれ変数メソッドが定義されていて、これらを呼び出すことでオブジェクトに処理を行うことができます。

例えば、

  • Rigidbodyの中にあるAddForceメソッドで力を加えたい
  • Transformの中にあるposition変数で座標を変更したい

といった処理をオブジェクトに行うことができます。

そして、このコンポーネントの中の変数やメソッドを呼び出すためには、GetComponentでそのコンポーネントを取得してから呼び出す必要があります。

そのため、コンポーネントの機能を使うためには、このGetComponentメソッドが非常に重要になってきます。

GetComponentの使い方

ここからは、GetComponentの使い方について紹介していきます。

GetComponentの後ろでコンポーネントを指定する

GetComponentを使う際は、後ろに<>内でコンポーネントの種類を指定することで取得することができます。

GetComponent<コンポーネント名>()

例えば、Rigidbodyコンポーネントを取得する場合は、

GetComponent<Rigidbody>()

と記述してあげます。

また、GetComponentメソッドは負荷が大きく何度も処理が行われないように、

using UnityEngine;

public class Test : MonoBehaviour
{
    Rigidbody rb;   // Rigidbody型の変数を宣言

    void Start()
    {
        rb = GetComponent<Rigidbody>(); // Rigidbodyコンポーネントを取得
    }
}

上記のように、5行目でRigidbody型の変数rb(変数名は何でもよい)を作り、Startメソッド内でその変数の中にコンポーネントを取得して入れる処理を行うことで、その後はGetComponentを使わず変数のrbだけでコンポーネントの機能を使うことができるようになります。

なお、座標の位置や向きなどを管理しているTransformコンポーネントだけは、このGetComponentを使う必要がありません。

なぜなら、

Transform transform;
transform = GetComponent<Transform>();

という処理がすでにUnity側でされているため、変数のtransformと書くだけでコンポーネントを使うことができるようになっています。

コンポーネントの中の変数やメソッドを呼び出す

GetComponentでコンポーネントを取得することができたら、その中にある変数メソッドを呼び出すことができます。

変数やメソッドを呼び出す場合は、

GetComponent<コンポーネント名>().変数
GetComponent<コンポーネント名>().メソッド()

といった形で記述することになります。

例えば、先ほどのRigidbodyコンポーネントを変数のrbで取得して、AddForceメソッドでスペースキーを押したら力を加えることができるようにしたい場合、

using UnityEngine;

public class Test : MonoBehaviour
{
    Rigidbody rb;   // Rigidbody型の変数を宣言

    void Start()
    {
        rb = GetComponent<Rigidbody>(); // Rigidbodyコンポーネントを取得
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(5.0f, 5.0f, 0); // AddForceメソッドを呼び出せる
        }
    }
}

と、if文の中の16行目でrigidbody.AddForce()と書いてあげることで、Rigidbodyコンポーネントの中に定義されているAddForceメソッドを呼び出して使うことができます。

他のオブジェクトのコンポーネントも取得できる

ここまでは、スクリプトにアタッチしているオブジェクトのコンポーネントを取得する方法を紹介していきましたが、GetComponentアタッチしていないオブジェクトのコンポーネントを取得することもできます。

スクリプトにアタッチしていないオブジェクトのコンポーネントを取得したい場合は、GetComponentの前でどのオブジェクトなのかをGameObject型で指定する必要があります。

GameObject.GetComponent<コンポーネント名>()

オブジェクトを取得する方法はいくつかありますが、ここではインスペクターウィンドウから指定してみます。

using UnityEngine;

public class Test : MonoBehaviour
{
    public GameObject player;   // GameObject型の変数をpublicで宣言
    Rigidbody rb;   // Rigidbody型の変数を宣言

    void Start()
    {
        rb = player.GetComponent<Rigidbody>(); // playerのRigidbodyコンポーネントを取得
        Debug.Log(rb.mass);
    }
}

5行目でpublicのアクセス修飾子を付けてGameObject型の変数を宣言して、インスペクターウィンドウからこの変数に対して、コンポーネントを取得したいオブジェクトをドラッグ&ドロップで指定してあげます。

これでオブジェクトを取得することができたので、10行目のように変数playerの後ろにGetComponentを付けて、そのオブジェクトに紐づくコンポーネントを取得することができます。

ここでは、Rigidbodyコンポーネントの中でオブジェクトの重さを管理している変数massを取得してコンソールウィンドウに表示させています。

他にも、コンポーネント名の部分にスクリプト名を入れてあげることで、そのオブジェクトで独自に設定した変数のデータを変えたりすることができるようになります。

まとめ

このページでは、Unityで使うことができるGetComponentメソッドについて、どんな特徴があるのか、仕様や使い方についてまとめていきましたが、いかがでしたでしょうか?

GetComponentメソッドとは、コンポーネントを取得することができるメソッドで、コンポーネントの機能を使う上で重要なメソッドになってきます。

GetComponentを使う際は、

GetComponent<コンポーネント名>()

と書いてあげることで、そのコンポーネントを取得することができます。

ただし、GetComponentの処理は負荷が大きいため、何度も処理が行われないように、Startメソッド内などで1度だけ取得してあげるといった使い方をしましょう。

最後までお読みいただきまして、ありがとうございました!

コメント