【Unity】GetComponentInParentで親のコンポーネントを取得できる

GetComponentInParentとは? Unity

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

このページでは、

「親オブジェクトのコンポーネントを取得したい!」

「GetComponentInParentの仕組みが知りたい!」

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

Unityでは、オブジェクトに紐づくコンポーネントを取得する場合に、通常GetComponentメソッドが使われます。

しかし、親オブジェクトのコンポーネントを取得したいという場合には、GetComponentInParentというメソッドが使われることがあります。

このGetComponentInParentは、ヒエラルキー上で自分自身から親側のオブジェクトに向かって、指定したコンポーネントを検索して取得することができるメソッドになっています。

そこでこのページでは、UnityのGetComponentInParentについて、どんなメソッドなのか、また使い方までをまとめていきます。

この記事を書いた人

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

GetComponentInParentとは?

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

親オブジェクトのコンポーネントを検索して取得できる

GetComponentInParentとは、冒頭でも解説した通り、ヒエラルキー上の親オブジェクトからコンポーネントを検索して取得することができるメソッドです。

通常、オブジェクトのコンポーネントを取得する場合、よく使われるのがGetComponentメソッドで、これは指定したオブジェクトからコンポーネントを取得することができるメソッドです。

一方で、GetComponentInParentは、名前の通り、指定したオブジェクトの親オブジェクトからコンポーネントを検索して取得できるメソッドになっています。

ただし、この後解説しますが、指定した自分自身のオブジェクトも検索対象となってきます。

自分から始まり親側に向かい指定したコンポーネントを探していく

GetComponentInParentの仕様として、指定した自分自身のオブジェクトからヒエラルキー上の親方向に向かって、指定したコンポーネントを検索し、そのコンポーネントが見つかり次第取得するというメソッドになっています。

つまり、GetComponentInParentのコンポーネントの検索は、まず自分自身のオブジェクトから始まり、段々と親オブジェクトを遡って探していくということになります。

例えば、GetComponentInParentを使って、親オブジェクトのRigidbodyコンポーネントを取得しようとします。

しかし、そもそも自分にRigidbodyコンポーネントが付いている場合は、自身のコンポーネントが取得されてしまうことになります。

一方で、自分自身にRigidbodyコンポーネントが付いていない場合は、親オブジェクトのRigidbodyコンポーネントを取得することができます。

そのため、GetComponentInParent親オブジェクトのコンポーネントを取得できるメソッドではありますが、あくまでも自分自身(指定したオブジェクト自身)が一番最初に検索されることになるため、注意しておきましょう。

なお、反対に子オブジェクトのコンポーネントを取得できるメソッドとして、GetComponentInChildrenというものもあります。

GetComponentInParentの使い方

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

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

GetComponentInParentの後ろ側に、<>で囲ってコンポーネント名を指定することで、そのコンポーネントを検索して取得してきます。

GetComponentInParent<コンポーネント名>();

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

GetComponentInParent<Rigidbody>();

と記述することで、自分から親側に向かってRigidbodyコンポーネントを検索して取得します。

ちなみに、指定したコンポーネントが見つからない場合は、「null」が返ってくることになります。

親オブジェクトを移動させる処理

実際に、Unity上でGetComponentInParentを使って、親オブジェクトを移動させるという処理を作ってみます。

ここでは、親オブジェクト(青色)にRigidbody2DCollider2Dのコンポーネントをアタッチしておき、子オブジェクト(緑色)にはCollider2Dのコンポーネントだけをアタッチしておきます。

そして、緑色の子オブジェクトに対して、以下のスクリプトをアタッチしておきます。

using UnityEngine;

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

    void Start()
    {
        rb = GetComponentInParent<Rigidbody2D>();   // Rigidbodyコンポーネントを検索して取得
    }

    void Update()
    {
        // キー操作による移動処理
        if (Input.GetKeyDown(KeyCode.D))
        {
            rb.AddForce(new Vector2(200f, 0));
        }
        if (Input.GetKeyDown(KeyCode.A))
        {
            rb.AddForce(new Vector2(-200f, 0));
        }
    }
}

9行目でGetComponentInParentを使って、親オブジェクトのRigidbody2Dコンポーネントを取得しています。

ちなみに、子オブジェクト自身にはRigidbody2Dコンポーネントを付けていないので、GetComponentInParentでは親オブジェクトに遡って検索されることになります。

そして、15行目から22行目でAddForceメソッドを使って、取得したRigidbody2Dにキー操作で力を加える処理を行っています。

これでゲームを実行してみると、

親オブジェクトに対して移動する処理が行われることで、子オブジェクトも一緒に移動しているのが分かります。

なお、もし子オブジェクトにRigidbody2Dコンポーネントが紐づいている場合は、自分自身のRigidbody2Dを取得してしまうことになるため、以下のように子オブジェクトだけが移動してしまいます。

まとめ

このページでは、UnityのGetComponentInParentについて、どんなメソッドなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

GetComponentInParentとは、ヒエラルキー上で自分から親オブジェクトに向かって、指定したコンポーネントを検索して取得することができるメソッドです。

このGetComponentInParentを使うことで、子オブジェクトから親オブジェクトに対して、ゲーム内での処理を作ることができるようになります。

ただし、GetComponentInParentの仕様として、自分自身のオブジェクトからコンポーネントを探し始めることになるので、注意しておきましょう。

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

コメント