こんにちは、ともくんのゲーム作り部屋にようこそ!
このページでは、
「親オブジェクトのコンポーネントを取得したい!」
「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を使って、親オブジェクトを移動させるという処理を作ってみます。
ここでは、親オブジェクト(青色)にRigidbody2DとCollider2Dのコンポーネントをアタッチしておき、子オブジェクト(緑色)には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の仕様として、自分自身のオブジェクトからコンポーネントを探し始めることになるので、注意しておきましょう。
最後までお読みいただきまして、ありがとうございました!






コメント