【Unity】GetComponent()の使い方とコンポーネントとスクリプトとの関係性を理解する

更新日:2023/05/30

Unityはゲームオブジェクトに複数のコンポ―メントを関連付けています。
ゲームオブジェクトからコンポ―メントを取得するとき、GetComponent()を使用します。

今回は、このGetComponent()の使い方と、補足としてコンポーネントとスクリプトの関係性についてお伝えします。

 

GetComponent()の使用例

まずは、GetComponent()の使用例をスクリプトコードで紹介します。

次のように Canvas内に Text1 と subText の二つの Textオブジェクト が作成されている状態を想定します。

エディターのイメージ

以降のスクリプトは、Text1 に割り付けられていると解釈してください。

例1:スクリプトが所持するコンポーネントの取得

スクリプトが所持しているゲームオブジェクトから、Textコンポーネントを取得するときは、次のように記述します。

public class text1Script : MonoBehaviour
{
    private Text t;
    void Start()
    {
        t = gameObject.GetComponent(typeof(Text)) as Text;
             // または
        t = gameObject.GetComponent<Text>();

        t.text = "Hello World!!";
    }
}

GetComponent()はコンポーネントの型を指定します。

例2:スクリプト外のコンポーネントの取得

Text1 のスクリプトから subText のTextコンポーネントを取得するときは、GameObject.Find(ゲームオブジェクト名)でゲームオブジェクトを取得します。
次に、GetComponent()でコンポーネントを取得します。

次のように記述します。

public class sampleXXX : MonoBehaviour
{
    private Text t;
    void Start()
    {
        t = GameObject.Find("subText").GetComponent(typeof(Text)) as Text;
             // または
        t = GameObject.Find("subText").GetComponent<Text>();

        t.text = "Hello World!!";
    }

}

前項は小文字から始まるgameObjectでした。
Find()はGameObjectの静的メソッドなので、大文字から始まります。

なお、Find()はアクティブなゲームオブジェクトを検索します。
非アクティブなゲームオブジェクトは取得できないので、注意しましょう。

補足:エディタで関連付けたオブジェクトからのコンポーネント取得

エディタで他のゲームオブジェクトを関連付けると、GameObject.Find()とGetComponent()を使用せずに外部オブジェクトのコンポーネントを取得できます。

まずは、スクリプトにpublic属性でプロパティを記述します。

public class sampleXXX : MonoBehaviour
{
    public Text t;
    void Start()
    {
         t.text = "Hello World!!";
    }
}

すると、エディタのScriptコンポーネントにプロパティの名前が表示されます。

エディタのScriptコンポーネントにプロパティの名前が表示

None(Text)と表示されているボックスに、Hierarchyウインドウからオブジェクトをドラッグアンドドロップします。
すると、オブジェクト名(Text)に変化します。

Hierarchyウインドウからオブジェクトをドラッグアンドドロップ

これで、スクリプト実行時にUnityがプロパティにコンポーネントをセットしてくれます。

コンポーネントではなくて、ゲームオブジェクトを取得したいときは、GameObject型でpublicプロパティを定義すればOKです。

public GameObject subTextGameObject;

 

コンポーネントとは

コンポーネントとはゲームオブジェクトに追加された個々の機能を指します。
様々なコンポーネントを取捨選択して、目的に適したゲームオブジェクトを構築します。

確認はエディターのInspectorウインドウでできます。

例えばTextオブジェクトは、3つのコンポ―ネントを持っています。
Rect TransformCanvas RenderTextの3つです。

上の図はスクリプトを追加しているので、4つのコンポーネントを所持しています。

 

スクリプトとgameObjectとコンポーネントの関係

次はデバッガ―を使用して、スクリプトとgameObjectとコンポーネントの関係を確認します。

スクリプトはMonoBehaviourを継承しています。
従ってgameObjectは、MonoBehaviourが所持するプロパティです。

実際には、次のような階層になっています。

gameObjectの階層

gameObjectは、Componentオブジェクトのプロパティです。
スクリプトからComponentまでは、次のように継承されています。

■継承の階層

スクリプト
    ┣ base ( UnityEngine.MonoBehaviour )
    ┃    ┣ base ( UnityEngine.Behaviour )
    ┃    ┃     ┣  base ( UnityEngine.Component )
    ┃    ┃     ┃      ┣  base ( UnityEngine.Object)
    ┃    ┃     ┃      ┣  gameObject

gameObjectの中を見ると、コンポーネントがあります。
どうして日本語なのか、どんな型なのかは置いておいて(わからん)、ここに4つのコンポーネントがありますね。

この中から、GetComponent()は指定された型のコンポーネントを検索してくれるわけです。

 

他のスクリプトのメソッドを実行する

他のゲームオブジェクトが持っているスクリプトを取得して、メソッドを実行したり変数にアクセスしたいケースがあります。
このケースでもGetComponent()使用しますが、少しコツのようなものが必要です。

方法は別のページで紹介しているので、参考にしてください。

更新日:2023/05/30

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。