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の個別指導のオンラインレッスンを行っています。
いいなと思ったら応援しよう!
よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!