学習記事一覧 · Unityクラス

【学習】MonoBehaviour クラス(スクリプトの基底クラス)

Unity 入門シリーズでは、

  • C# スクリプトで MonoBehaviour を継承した
  • Start と Update で処理を書いた

という形でスクリプトの基本を学びました。

しかし、MonoBehaviour には他にも重要なメソッドやライフサイクルがあります。

MonoBehaviour クラス

の主な API をまとめて押さえましょう。

今回は MonoBehaviour のライフサイクルとよく使うメソッドを解説します。

今日学ぶこと

  • Awake / Start … 初期化のタイミング
  • Update / FixedUpdate / LateUpdate … 描画フレームや物理ステップごとの処理
  • OnEnable / OnDisable … 有効化・無効化のタイミング
  • GetComponent … コンポーネントを取得する
  • gameObject / transform … 自分自身への参照

MonoBehaviour とは

MonoBehaviour は、GameObject に載せる コンポーネント用スクリプトの基底クラスです(データだけの ScriptableObject など、別の基底を使うスクリプトもあります)。これを継承したクラスを GameObject にアタッチすると、Unity がライフサイクルメソッドを自動的に呼び出します。

using UnityEngine;

public class MyScript : MonoBehaviour
{
    // Unity が呼び出す
}

ライフサイクル(種類別)

「毎フレームのあとに OnDestroy が来る」わけではありません。初期化・繰り返し・無効化・破棄は別のタイミングです。

初期化(オブジェクトの立ち上がり)

メソッド 呼ばれるタイミング
Awake MonoBehaviour が初期化されるとき、1回だけ(非アクティブで置いた場合は初めて有効になったときなど)。同じオブジェクトでは OnEnable や Start より先。別オブジェクトの Awake との前後は基本は保証されない(必要なら Script Execution Order で指定)
OnEnable オブジェクトやコンポーネントが有効になったとき。毎回
Start そのインスタンスについて、最初の Update より前に 1 回(シーン開始直後だけでなく、途中で生成したオブジェクトも同様)

繰り返し(ゲーム進行中)

メソッド 呼ばれるタイミング
FixedUpdate 物理演算用の固定間隔(既定では約 0.02 秒)。1 フレームに 0 回・複数回あり得る。Update とは別のステップ
Update 描画フレームごと。呼ばれる間隔は フレームレートに依存(60fps 固定ではない)
LateUpdate そのフレーム内で、ほかの Update の処理の後。別オブジェクトの LateUpdate 同士の順序も基本は保証されない

無効化・破棄

メソッド 呼ばれるタイミング
OnDisable オブジェクトやコンポーネントが無効になったとき
OnDestroy オブジェクトが破棄されるとき

Awake と Start の違い

メソッド 用途
Awake そのオブジェクトの初期化。参照の取得など。必ず Start より前(同じオブジェクト内)
Start そのオブジェクトの「最初の Update 前」の初期化。Awake の後(同じオブジェクト内)
void Awake()
{
    // このオブジェクトでは Start より先に1回。別オブジェクトの Awake より前とは限らない
}

void Start()
{
    // 1回だけ。最初の Update の前
}

Update と FixedUpdate の違い

メソッド 用途
Update 入力、移動、UI など。フレームレートに依存する処理
FixedUpdate 物理演算(Rigidbody の操作)。固定間隔で実行(1 フレームに複数回あり得る)
LateUpdate カメラの追従など、そのフレームの Update の後に実行したい処理
void Update()
{
    // 描画フレームごと。入力や Transform の操作
}

void FixedUpdate()
{
    // 物理演算用。Rigidbody の AddForce など
}

OnEnable / OnDisable

GameObjectSetActive(true) / false のほか、Inspector で コンポーネントのチェックを入れたり外したりしたときにも呼ばれます。

void OnEnable()
{
    // 有効になったとき。毎回呼ばれる
}

void OnDisable()
{
    // 無効になったとき
}

GetComponent(コンポーネント取得)

GetComponent で、同じ GameObject にアタッチされたコンポーネントを取得できます。

// Rigidbody2D を取得
Rigidbody2D rb = GetComponent<Rigidbody2D>();

// SpriteRenderer を取得
SpriteRenderer sr = GetComponent<SpriteRenderer>();

// 取得できない場合は null
if (rb != null)
{
    rb.linearVelocity = Vector2.zero; // 古い Unity では rb.velocity
}
メソッド 説明
GetComponent<T>() 最初に見つかったコンポーネントを取得
GetComponentInChildren<T>() 子を含めて検索
GetComponentInParent<T>() 親を含めて検索

gameObject / transform

MonoBehaviour には、自分自身への参照が用意されています。

プロパティ 説明
gameObject このスクリプトがアタッチされている GameObject
transform この GameObject の Transform(gameObject.transform の省略形)
// 自分自身を削除
Destroy(gameObject);

// 自分の位置を変更
transform.position = new Vector3(0, 0, 0);

完成コード例

using UnityEngine;

public class LifecycleSample : MonoBehaviour
{
    private Rigidbody2D rb;

    void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    void Start()
    {
        Debug.Log("Start: 最初の Update より前に1回");
    }

    void Update()
    {
        // 描画フレームごとの処理
    }

    void OnDestroy()
    {
        Debug.Log("破棄されました");
    }
}

重要ポイント

MonoBehaviour は、GameObject に載せるコンポーネント用スクリプトの基底クラスです。

  • Awake … コンポーネント初期化時に1回。Start より前。参照の取得
  • Start … そのインスタンスの最初の Update より前に1回。初期化
  • Update … フレームごと。入力や移動(間隔はフレームレートに依存)
  • FixedUpdate … 物理演算用(固定間隔。1フレームに複数回あり得る)
  • LateUpdate … そのフレームの Update の後(カメラ追従など)
  • GetComponent … コンポーネントを取得
  • gameObject / transform … 自分自身への参照

発展アイデア

  • Invoke / InvokeRepeating … 遅延実行、一定間隔の実行
  • Coroutine … 複数フレームにわたる処理
  • DontDestroyOnLoad … シーン切り替えで破棄されないようにする

MonoBehaviour は Unity スクリプトの土台 です。ライフサイクルを理解すると、意図したタイミングで処理を書けます。