UnityでC#スクリプトを作ると、必ずpublic class MyScript : MonoBehaviourという一文が付いてきます。「おまじない」として何となく書いているけれど、これが何者なのかは説明できない——そんな方は意外と多いのではないでしょうか。
MonoBehaviourは、UnityのAPIと自作スクリプトを繋ぐ「基底クラス」です。これを継承(:の右側に記述)するだけで、スクリプトはゲームオブジェクトにコンポーネントとして追加できるようになり、UpdateやStartといったイベントを受け取り、transformやgameObjectといった便利なプロパティが使えるようになります。
この記事でわかること
MonoBehaviourを継承すると何ができるようになるのかtransform・gameObject・GetComponent<T>()の使い方Instantiate/Destroyによるオブジェクトの生成と破棄- 「
newできない」「Invokeは文字列指定」などのつまずきポイント
MonoBehaviourの役割
MonoBehaviourを継承する主なメリットは以下の通りです。
- コンポーネント化: 作成したスクリプトをゲームオブジェクトのコンポーネントとしてアタッチできるようになります。これにより、オブジェクトに振る舞いを追加できます。
- ライフサイクルイベントの受信:
Awake,Start,Updateなど、Unityが定義した特定のタイミングで自動的に呼び出されるイベント関数を使用できます。 - 主要プロパティへのアクセス: スクリプトがアタッチされているゲームオブジェクト自身や、そのTransformコンポーネントなどに簡単にアクセスできます。
- コルーチンの実行:
StartCoroutineメソッドを使って、「3秒待ってから実行」「数フレームに分けて少しずつ処理」のような 時間をまたぐ処理 を書けます。別スレッドで動くわけではなく、 メインスレッド上で処理を分割・待機する仕組み です(詳しくは コルーチンの記事 へ)。
MonoBehaviourの立ち位置を図にすると、「Unityエンジンと自作スクリプトを繋ぐ架け橋」というイメージになります。継承した瞬間から、Unity側のイベント(AwakeやUpdateなど)が自分のスクリプトに届くようになるわけです。

もしMonoBehaviourを継承しないただのC#クラス(POCO - Plain Old C# Object と呼ばれることもあります)を作成した場合、それはUnityのゲームオブジェクトにアタッチできず、ライフサイクルイベントも受け取れません。そうしたクラスは、データ保持専門のクラスや、計算処理専門のクラスとしてMonoBehaviourから呼び出して使うことになります。
「切り出す」感覚を小さな例で見てみましょう。ダメージ計算はUnityの機能を何も使わないので、普通のC#クラスにできます。
// MonoBehaviourを継承しない、計算専門の普通のC#クラス
public class DamageCalculator
{
public int Calculate(int attack, int defense)
{
int damage = attack - defense;
return damage < 1 ? 1 : damage; // 最低でも1ダメージ
}
}
これをMonoBehaviour側から呼び出します。
using UnityEngine;
public class Enemy : MonoBehaviour
{
// 普通のC#クラスは、MonoBehaviourと違ってnewで作れる
private DamageCalculator calculator = new DamageCalculator();
public void OnAttacked(int attack, int defense)
{
int damage = calculator.Calculate(attack, defense);
Debug.Log($"受けたダメージ: {damage}");
}
}
こうしておくと、ダメージ計算のロジックはシーンにもGameObjectにも依存せず、テストや使い回しがしやすくなります。 「Unityと対話する部分はMonoBehaviour、純粋な計算やデータは普通のクラス」 という分担は、上達してからも効き続ける基本です。
補足:
MonoBehaviourを継承したクラスは、new MyScript()のようにnewでインスタンス化することはできません 。必ずAddComponent<MyScript>()でゲームオブジェクトに追加するか、エディタ上でアタッチして生成します。これはつまずきやすいポイントなので覚えておきましょう。
主要なプロパティとメソッド
MonoBehaviourを継承したスクリプト内では、多くの便利なプロパティやメソッドを直接呼び出すことができます。ポイントは、 スクリプトは「自分がアタッチされている器(GameObject)」を起点に、器自身や同じ器の中の部品へ直接アクセスできる ということです。
