【学習】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
GameObject の SetActive(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 スクリプトの土台 です。ライフサイクルを理解すると、意図したタイミングで処理を書けます。