こんにちは、Unityエンジニアのオオバです。

お悩みさん
お悩みさん
  • Unity始めてすぐ登場する「MonoBehaviour」って何?
  • MonoBehaviourの正しい使い方を知りたい
  • MonoBehaviourのよくあるトラブルを知りたい
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    Unityをはじめると最初に出てくる 「MonoBehaviour」 という単語。
    何者?と思うかもしれません。

    一言で表すと MonoBehaviourはUnityでゲーム開発する上で必要不可欠 です。
    MonoBehaviourを使うことでゲームの機能を開発できます。

    裏を返せば MonoBehaviourを理解していないとゲーム開発は出来ません。

    何事も基礎が大事。
    MonoBehaviourはUnityの基礎中の基礎

    本記事はUnity歴8年のMonoBehaviour知識を 全力 で詰め込みました。
    ぜひとも最後まで読んでMonoBehaviourの理解に役立ててください。


    Unityに興味あるけど始め方がわからない方はこちらの記事をどうぞ。
    ダウンロードからインストールまで徹底的に解説しています。

    あなたはゲーム機能をMonoBehaviourで作ることになる

    はじめに結論を簡単にまとめます。

    Unityゲーム開発の基礎MonoBehaviour

    ①MonoBehaviourとはコンポーネント

    ②MonoBehaviourを継承して自作機能を作る

    ③MonoBehaviourを使うとイベント関数が使用可能

    ④初心者はとりあえずMonoBehaviourを使えばOK

    MonoBehaviourはUnityプログラミングの基礎中の基礎
    ゲームを開発する上でなくてはならない機能 です。
    あなたは 必ずMonoBehaviourを使って開発するゲームの機能を作る ことになります。

    後述しますが、 Awake、Startメソッドといったイベント関数がMonoBehaviourの肝

    これらの特性を理解してゲーム開発を効率よく進めていきましょう。

    →11万文字で徹底解説した「DOTweenの教科書」Unityアニメーションの超効率化ツールはこちら

    UnityのMonoBehaviour(モノビヘイビア)とは

    MonoBehaviourとはUnityでプログラミングするための基本クラス です。
    読み方は 「モノビヘイビア」

    Unityでゲーム作りするときには必ず登場します。
    ゲーム開発をとても楽にしてくれるのがMonoBehaviourなのです。

    MonoBehaviourの使用例を挙げてみましょう。

    MonoBehaviourの使用例

    ①GameObjectにゲームの機能を追加

    ②プログラミングの開始ポイント(後述:イベント関数)

    ③毎フレーム処理の実行

    この中で最も重要なのは 「①GameObjectに独自の機能を追加」 です。
    機能追加しなければゲームを開発できませんよね。

    詳しくは後述しますが、
    MonoBehaviourを使うことでゲームの機能を追加することができる のです。

    MonoBehaviourは画面に登場するオブジェクトに使用

    MonoBehaviourはどのようなときに使用されるのでしょうか。
    その1つが 画面上に登場するオブジェクト です。

    例えばゲーム中にキャラクターを登場させて、動かしたくなると思います。
    そのキャラクターにはMonoBehaviourが使われています。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_0

    上の動画の各キャラクターはMonoBehaviourを使用しています。

    パズルゲームのピースもMonoBehaviourを使用

    Unityでパズルゲームを作るとします。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_1

    パズルゲームのピースにもMonoBehaviourが使われています。

    つまり、 画面上に登場するオブジェクトにはMonoBehaviourが使われている ということです。

    こちらのパズルはアセットストアで販売中の
    Frozen GUI Packというアセットを使わせていただきました。

    自作コンポーネントはMonoBehaviourを継承する

    Unityでプログラミングするときに外せない概念「コンポーネント」。
    コンポーネントとMonoBehaviourの理解は必須です。

    結論から言うと、 開発者が自作の機能(コンポーネント)を作成する場合、
    必ずMonoBehaviourを継承する必要がある
    のです。

    コンポーネントとは?

    Unityで使われる 「コンポーネント」 とは開発するゲームの「機能」のこと です。
    厳密にはGameObject(ゲームオブジェクト)に追加される機能。

    コンポーネントは単体で動作しません。
    GameObjectに追加することで初めてコンポーネントは動きます。

    例えば、 カメラ機能であればCameraコンポーネント を。
    当たり判定機能はColliderコンポーネント

    すべてのコンポーネントはGameObjectに追加して初めて動作するのです。

    GameObjectとコンポーネントの違いを詳しく解説しました。
    GameObjectとコンポーネントの理解に不安 がある方はぜひ読んでみてください。

    コンポーネントはこちら。

    GameObjectはこちらの記事で徹底的に解説しています。

    MonoBehaviour自体もコンポーネント

    実は MonoBehaviour自体もコンポーネント です。
    そして MonoBheaviourはUnityの中では特殊なコンポーネント。
    コンポーネントとは「ゲームの機能」と説明しましたよね。

    開発者のあなたも自作のコンポーネントを作るはず。
    繰り返しになりますが、 MonoBehaviourを継承することで自作の機能を作れる のです。

    MonoBehaviour継承でGameObjectに機能追加可能

    「MonoBehaviourを継承とはどうすればよいの?」 と思いますよね。

    そこで、MonoBehaviourを継承した、
    世界一シンプルな自作コンポーネント「SimpleScript」を作ってみます。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_2

    メニューAssets > Create > C# Script からC#スクリプトを作ってみましょう。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_3

    ProjectウィンドウにC#スクリプトファイルが作られるので、
    SimpleScript と名前をつけてVisual Studioなどのエディタで開きます。

    💻ソースコード : SimpleScript.cs
    using UnityEngine;  
    public class SimpleScript : MonoBehaviour  
    {
    }
    

    上記のソースコードをコピーします。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_4

    上の動画を参考に 既存コードを削除 して、
    SimpleScript.csを書き換えてみてください。

    このあと、この世界一シンプルな自作コンポーネント SimpleScriptをGameObjectに追加 します。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_5

    上の動画のように GameObjectにSimpleScriptを追加してみます。

    このように MonoBehaviour を継承すると、
    GameObjectに追加(AddComponent)できる のです。

    Unity初心者におすすめするプログラミングエディタは無料のVisual Studio です。
    まだインストールしていない方はこちらの記事を参考にどうぞ。

    MonoBehaviourの「継承」とは?

    今まで何度も出てきた「継承」について解説します。
    継承はUnityで使われているプログラミング言語「C#(シーシャープ)」の機能です。

    継承とは 「機能を引き継ぐことができる機能」
    C#以外の言語でも多く実装されています。

    継承元のクラスから派生したクラスに機能を引き継げます。
    つまり 派生クラスは派生元クラスの機能が使えるようになる のです。

    // 継承元クラス  
    public class Parent  
    {
        protected void ParentFeature()  
        {
            // 継承元の機能  
        }
    }
    
    // 派生クラス(Parentクラスを継承)  
    public class Child: Parent  
    {
        public ChildFeature()  
        {
            // 継承元の機能を実行  
            ParentFeature();  
        }
    }
    

    継承の文法自体はとても簡単。
    class 派生クラス : 継承元クラス です。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_6

    分かりやすく 継承元を親クラス派生クラスを子クラス と呼ぶことがあります。

    class 自作コンポーネント : MonoBehaviour  
    

    つまり、自作コンポーネントは上の文法で作成できるのです。

    MonoBehaviour継承で自動的に呼ばれる代表的なメソッド6選

    MonoBehaviourはUnityにとって特殊なコンポーネント と解説しました。

    その1つは、MonoBehaviourを継承すると、
    自動的に呼ばれるメソッドがいくつもあるのです。
    この自動的に呼ばれるメソッドを 「イベント関数」 と呼ばれます。
    前述の ゲーム開発をとても楽にしてくれる機能の1つ

    イベント関数は MonoBehaviourを使う上で超重要 なのでしっかりと理解しておく必要があります。

    本記事では代表的な6つを紹介します。ぜひ覚えておきましょう。

    MonoBehaviour継承で自動的に呼ばれる代表的なメソッド6選

    ①Awakeメソッド

    ②Startメソッド

    ③OnEnableメソッド

    ④OnDisableメソッド

    ⑤Updateメソッド

    ⑥OnDestroyメソッド

    ①Awakeメソッド

    AwakeメソッドはMonoBehaviourの中で最初に呼ばれるメソッド です。
    初期化処理に使われます。

    Awakeは以上のような特徴を持っています。

    特に 「GameObjectがONの状態(アクティブ)で動作」 には注意。
    AwakeはMonoBehaviourがOFF(非アクティブ)の状態でも、
    GameObjectがON(アクティブ)ならで動作します。

    プログラムの動作がおかしいなと感じた際は、
    Awakeの特徴を思い出してみてください。

    ②Startメソッド

    StartメソッドはAwakeと同様、初期化に使われます。

    Awakeと違うのは1フレーム後に実行されること。
    ゲーム開始時にちらっと不要なオブジェクトが表示される場合は、
    Startをチェック。1フレーム不要な描画が行われているのかもしれません。

    個人的に 初期化処理はStartではなくAwakeで実行するほうが安全 という考えです。

    ③OnEnableメソッド

    Awake、Startと同様、初期化に使われます。
    ただし、Awake、Startと違い、何度も呼ばれるのが大きな特徴。

    OnEnableメソッドは何度も実行される 点が、Awake、Startと大きく違う点です。
    ON/OFFを切り替えるときに処理をはさみたい場合に便利 です。

    ④OnDisableメソッド

    OnEnableの逆。OFFになると呼ばれます。

    OnDisableはコンポーネントを削除(Destroy)したときも動作 するので注意。
    GameObjectを削除(Destroy)したときもコンポーネントは削除 される点も忘れやすいので注意です。

    ⑤Updateメソッド

    Updateは毎フレーム実行するメソッドです。

    Updateメソッドはよく使います。
    キャラクターを動かす、弾の発射といった処理を作るときなど。

    ⑥OnDestroyメソッド

    OnDestroyはMonoBehaviourを削除すると動作するメソッドです。

    「過去にAwakeを実行していないと動作しない」は要注意
    GameObjectが非アクティブの状態のままだとOnDestroyは動かないということです。

    イベント関数2つの注意点

    ゲーム開発を楽にするMonoBehaviourのイベント関数ですが、
    注意点が2点あります。

    注意点①イベント関数は記述しないと実行されない

    MonoBehaviourのイベント関数は記述しないと実行しません。
    実際に確認してみましょう。

    イベント関数を一切記述しないコンポーネントを用意します。

    💻ソースコード : イベント関数が動かない例
    using UnityEngine;  
    public class SimpleScript : MonoBehaviour  
    {
    }
    

    上記のコードではイベント関数を記述していません。
    つまり イベント関数は呼ばれない ということです。

    💻ソースコード : イベント関数が動作する例
    using UnityEngine;  
    public class SimpleScript : MonoBehaviour  
    {
        // メソッドを記述すると動作する  
        void Awake()  
        {
        }
    }
    

    上記のようにイベント関数Awakeを記述するとAwakeが動き出します。

    もちろんAwake以外は記述していないため、
    Awake以外のイベント関数は動作しません。

    あくまで記述したイベント関数が動作するのです。

    注意点②アクティブな状態(ONの状態)で初めて動く

    ほとんどのイベント関数は、GameObject、MonoBehaviourともにONの状態で動作します。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_7

    動作しないときは、上記にチェックが入っているか確認してみましょう。

    よく使うMonoBehaviourの機能2選

    よく使うMonoBehaviourの機能2選

    ①コルーチン

    ②enabled

    MonoBehaviourを継承した際によく使う機能を2つ紹介します。

    ①コルーチン : 処理の中断と再開

    MonoBehaviourでよく利用する機能の1つはコルーチンです。
    「コルーチン」 はUnity初心者には聞き慣れないキーワードですよね。

    コルーチンとは関数の一種で処理のタイミングをずらすことができます。
    つまり 関数内の中断と再開が可能

    非同期処理 と呼ばれることもあります。

    コルーチンの作り方の手順はこちら

    次の例では処理を1フレーム待機しました。

    using UnityEngine;  
    using System.Collections;  
    public class SimpleScript : MonoBehaviour  
    {
        void Awake()  
        {
            StartCoroutine(Test());  
        }
    
        IEnumerator Test()  
        {
            // 1フレーム待機  
            yield return null;  
            Debug.Log("1フレーム後にログ出力");  
        }
    }
    

    1フレーム待機した後にConsoleウィンドウにログが出力されます。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_8

    次は2秒待機してみます。

    using UnityEngine;  
    public class SimpleScript : MonoBehaviour  
    {
        void Awake()  
        {
            StartCoroutine(Test());  
        }
    
        IEnumerator Test()  
        {
            // 2秒待機  
            yield reteurn new WaitForSeconds(2f);  
            Debug.Log("2秒後にログ出力");  
        }
    }
    

    WaitForSeconds クラスを使うと 処理を指定した秒数待機できる のです。
    どういう場面でコルーチンを使うべきかまだわからないかもしれません。
    しかし、 コルーチンはゲーム開発の中では強力な機能 です。

    コルーチンは今後必ず登場します。
    ここでは、 「コルーチンは処理の中断と再開できる関数」 と覚えておいてください。


    こちらの記事でコルーチンを徹底解説しました。
    コルーチンの理解に不安を覚えている方はぜひ読んでみてください。

    ②enabled : MonoBehaviourのON/OFF切り替え

    MonoBehaviourのON/OFFの話が何度も出てきました。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_9

    チェックボックスがON(アクティブ)状態でイベント関数がうごきましたよね。

    アクティブ状態をプログラムから切り替える方法を紹介します。

    using UnityEngine;  
    public class SimpleScript : MonoBehaviour  
    {
        void Awake()  
        {
            enabled = false;  
        }
    }
    

    enabled プロパティにtrueまたはfalseを代入することでON/OFFを切り替えられます。
    コルーチンと同様、非常によく使う機能なので覚えておきましょう。

    GameObjectにもON/OFFを切り替える SetActive メソッドが存在します。MonoBehaviourの enabled と内容がすこし被ります。

    どちらを使うべきか考察してみましたので、使い分けに迷う方は以下の記事をどうぞ。

    MonoBehaviourを使わないケース2選

    すべてのUnityプログラミングでMonoBehaviourを使わないといけないわけではありません。

    MonoBehaviourが不要なケースを紹介します。

    MonoBehaviourを使わないケース2選

    ①GameObjectを使わなくて良いケース

    ②純粋にC#だけを使うケース

    ケース①GameObjectを使わなくて良いケース

    MonoBehaviourを使わなくて良いケースは、
    「GameObjectを使わなくて良いケース」なのですが、
    そもそもGameObjectを使うべきケースを紹介します。

    GameObjectを使うケースとは、
    Hierarchyウィンドウに実体を必要とするケースです。
    Hierarchyウィンドウとは、現在使用中のGameObjectが一覧で並ぶウィンドウ

    キャラクターパズルのピース
    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_10
    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_10

    繰り返しになりますが、キャラクターやパズルのピースはGameObjectを使います。
    理由は 画面に表示する必要があり、さまざまな機能を実装するから です。

    👉 【無料】SD版Unityちゃんのダウンロードから使い方を解説!

    画面に表示されるということは、Hierarchyウィンドウに実体が存在するということです。

    「GameObjectを使わなくて良いケース」とはこの逆。
    Hierarchyに実体をもつ必要のないケースです。

    例えばデータを定義したクラスです。

    💻ソースコード : データを定義したクラス
    public class CharacterData  
    {
        public string name; // 名前  
        public int hp; // HP  
        public int mp; // MP  
    }
    

    上記のような データ定義のクラスはGameObjectを使いません。
    つまりMonoBehaviourを継承する必要がないのです。

    Unityエディタにはさまざまなウィンドウがあります。
    中でも初心者向けに厳選した11のウィンドウを取り上げて解説しました。
    Unityの基礎力アップしたい人はぜひ読んでみてください。

    ケース②純粋にC#だけを使うケース

    例えば純粋に計算処理をしたいだけの場合、MonoBehaviourは不要です。
    ゲーム開発でよくあるダメージ計算式もそうです。

    例えば以下のコードです。

    public static class DamageCaluculator  
    {
        // ダメージを計算  
        public static int ResolveHitSkill(int playerId, int enemyId, int useSkillId)  
        {
            int result;  
            // ~~~~~ ダメージ計算処理 ~~~~~  
            return result;  
        }
    }
    

    DamageCaluculator クラスはMonoBehaviourを継承していません。
    ダメージ計算機能は、画面上に表示する必要はありません。
    つまりGameObjectは不要なのです。

    このように純粋にC#を使いたい場合はMonoBehaviourを使いません。
    使わないほうが処理負荷は下がります。

    初心者にはMonoBehaviourの使用がオススメ

    ここまでMonoBehaviourを使わないケースを紹介しましたが、
    初心者はすべてのスクリプトにMonoBehaviourを使って大丈夫 です。

    なぜならMonoBehaviourだけでもゲームは作れるからです。
    MonoBehaviourを使う使わない判断はプログラミングの知識を必要とします。

    そういう細かい部分で消耗するくらいならどんどん開発を進めていくほうが健全。MonoBehaviourの使用判断は慣れてくればわかるようになります。

    とりあえず初心者は何でもMonoBehaviourを使っていけばよいです。

    MonoBehaviourのよくあるトラブル

    MonoBehaviourにまつわるよくあるトラブルを紹介します。

    MonoBehaviourのよくあるトラブル

    ①スクリプトをアタッチできない問題

    ②Awake、Start、Updateが呼ばれない問題

    ③MonoBehaviourのnewは禁止

    トラブル①スクリプトをアタッチできない問題

    MonoBehaviourを継承したC#スクリプトをGameObjectにAddComponentできないトラブルはよくあります。
    ここでは解決策を2点紹介します。

    その1. クラスとスクリプトファイルが別名

    独自コンポーネントはクラスとスクリプトを同名にする必要があります。
    非常に重要なルールですが、間違えやすいです。

    次の例は間違ったファイル名とクラス名です。

    💻ソースコード : Piyo.cs
    using UnityEngine;  
    public class Hoge : MonoBehaviour  
    {
    }
    

    ファイル名 Piyo.cs に対して、クラス名 Hoge
    この場合、GameObjectにアタッチ(AddComponent)できません。

    正しくは以下。

    💻ソースコード : Piyo.cs
    using UnityEngine;  
    public class Piyo : MonoBehaviour  
    {
    }
    

    ファイルとクラスを同名 にしましょう。

    その2. コンパイルエラー発生中

    Unityがコンパイルエラー中はスクリプトをアタッチできません。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_11

    コンパイルエラーはConsoleウィンドウから確認 できます。
    上図の枠内がコンパイルエラー。

    コンパイルエラーとはプログラミングの文法ミスでコンパイルできないエラーのこと。
    コンパイルエラー中はUnityを再生することはできません。

    文法を間違うとコンパイルは失敗してしまうのです。
    そして、 コンパイルエラー状態ではスクリプトをアタッチできません。

    Consoleウィンドウからエラーを確認して直しましょう。
    すると、スクリプトがアタッチできるようになります。

    トラブル②Awake、Startなどのイベント関数が呼ばれない問題

    イベント関数が呼ばれないとき、
    GameObject、コンポーネントの非アクティブを疑いましょう。

    イベント関数はGameObject、コンポーネント(MonoBehaviour)ともにアクティブである必要があります。

    下の2箇所にチェックが入っている必要あり。

    【Unityの基礎】MonoBehaviour徹底解説【初心者向け】_12

    どちらかにチェックが入っていない場合は非アクティブ状態。
    イベント関数は呼ばれないのです。

    トラブル③MonoBehaviourのnewは禁止

    最後はトラブルではなく、MonoBehaviourの注意点の共有です。
    MonoBehaviourを動的に生成したいときが出てきます。
    new キーワードを使いたくなるのですが、Unityでは禁止です。

    var mono = new MonoBehaviour()  
    

    以下のような警告文が表示されてしまいます。
    要約すると、「newは禁止、AddComponentを使いましょう」とのこと。

    You are trying to create a MonoBehaviour using the 'new' keyword.  This is not allowed.  
    MonoBehaviours can only be added using AddComponent().  
    Alternatively, your script can inherit from ScriptableObject or no base class at all  
    

    正しくは以下です。

    var mono = gameObject.AddComponent<MonoBehaviour>();  
    

    AddComponent メソッドを使ってGameObjectに追加しましょう。

    Unityプログラミングの基礎MonoBehaviourまとめ

    Unityプログラミングの基礎「MonoBehaviour」について解説してきました。
    記事の内容を簡単にまとめます。

    MonoBehaviourまとめ

    ①MonoBehaviourはコンポーネント(コンポーネントとはゲームの機能)

    ②自作コンポーネントはMonoBehaviourを継承する

    ③イベント関数が大事

    ④コルーチンとenabledをよく使う

    ⑤すべてにMonoBehaviourを使う必要ないが、初心者はMonoBehaviourを使おう

    こんな感じです。

    MonoBehaviourが何ものなのかなんとなくわかったと思います。
    一言で表すと MonoBehaviourとはコンポーネント です。

    今までの説明の通りUnityの数あるコンポーネントの中でMonoBehaviourは特殊。
    開発者が自作コンポーネントを作るために必須の機能です。

    今後ゲームを作っていく中でMonoBehaviourを何度も使うことになるでしょう。
    ときおりMonoBehaviourが何者かわからなくなる時がきます。
    そんなときにこの記事を思い出してみてください。
    初心者向けのMonoBehaviour情報を詰め込んでいます。
    ぜひブックマークして何度も読み直してみましょう。

    次の記事は MonoBehaviourを含むコンポーネント全体を網羅し、徹底的に解説した記事を執筆 しました。
    本記事とあわせて読むことでより深くUnityを学べます。Unity初心者におすすめです。

    この記事があなたのゲーム開発に少しでもお役に立てたら嬉しいです。

    「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
    ぜひチャンネル登録をお願いします!

    最後まで読んでいただきありがとうございました!
    すばらしいUnityライフをお過ごしください。

    オススメ記事
    検証環境