この記事で学べること
- Unityのライフサイクルの全体像
- Awake()・Start()・Update()・FixedUpdate()・LateUpdate() の違いと使い分け
- 初期化・物理処理・カメラ制御の正しい配置方法
- ライフサイクルを考慮した最適なコード設計
Unityのライフサイクルとは?
ピッグダディ
Unityではスクリプトやオブジェクトが自動で呼び出される”イベント関数”があって、それが一定の順番で動いていく。
この流れのことを“ライフサイクル”って呼ぶんだ。
AwakeとStartの違いって、いつも迷うよね。
UpdateやFixedUpdateの使い分けも、慣れるまで難しいんだ。
ピッグボーイ
それ毎回調べちゃうんですよね…
ピッグガール
私もシーンビューでは動いてるのに、
思った通りに動かなくて困ったことあります
ピッグダディ
よし、今回はUnityのライフサイクルについて、
順を追ってしっかり解説していくよ!
Unityのイベント関数・ライフサイクルの流れ
Unityでは、GameObjectが生成されてから破棄されるまで、以下のような順序でイベント関数が実行されます。
Awa
ke() :オブジェクト生成時に最初に実行。依存関係の初期化向け。- OnEnable() :オブジェクトがアクティブになったときに呼ばれる。
- Start() :Awakeのあと、最初のフレーム前に一度だけ実行。
- Update() :毎フレーム実行。プレイヤー入力など。
- FixedUpdate() :物理演算向け。一定間隔で実行。
- LateUpdate() :Updateの後に実行。カメラ制御などに最適。
- OnDisable():オブジェクトが無効化されたときに呼ばれる。
- OnDestroy() :破棄直前のクリーンアップ処理に使用。
※ 詳しいライフサイクルを知りたい方は公式サイトをご確認ください。
公式サイトリンク:イベント関数の実行順序
Awake() vs Start()の違い
Awake()
- 実行タイミング:最初(オブジェクト生成時)
- 主な用途:依存関係の初期化、シングルトン管理
- 注意点:非アクティブ状態でも実行される
void Awake() {
Debug.Log("Awake実行");
// 他スクリプトの初期化などに使う
}
Start()
- 実行タイミング:Awakeの後、最初のフレームの直前
- 主な用途:コンポーネント取得、初期状態設定
- 注意点:非アクティブなオブジェクトでは実行されない
オブジェクトの初期化の適切な処理方法
オブジェクトを適切に初期化するには、Awake() と Start() の使い分けが重要 です。
➡ Awake()で依存関係(他のスクリプトやデータ)を設定
➡ Start()で、オブジェクトの状態を初期化
public class GameManager : MonoBehaviour
{
public static GameManager instance;
//Awake() の使用例(依存関係の初期化)
void Awake()
{
instance = this;
DontDestroyOnLoad(gameObject);
}
Start() の使用例(オブジェクトの初期設定)
void Start()
{
Rigidbody rb = GetComponent<Rigidbody>();
rb.mass = 2.0f;
}
}
Update() と FixedUpdate() の違い
Update()
- 実行頻度:毎フレーム(フレームレート依存)
- 主な用途:ユーザー入力、アニメーション
//Update() の使用例(プレイヤーの移動)
void Update()
{
float move = Input.GetAxis("Horizontal");
transform.position += new Vector3(move, 0, 0) * Time.deltaTime;
}
※ Transformについては以下のサイトを参考にしてください。
FixedUpdate()
- 実行頻度:一定間隔(Time.fixedDeltaTime)
- 主な用途:物理演算(Rigidbody)
//FixedUpdate() の使用例(Rigidbody の移動)
void FixedUpdate()
{
Rigidbody rb = GetComponent<Rigidbody>();
rb.velocity = new Vector3(0, 0, 5);
}
※ Rigidbodey、Colliderについては以下のサイトを参考にしてください。
物理演算を適切に処理する方法
物理演算を扱う場合、FixedUpdate()を使用することで安定したシミュレーションが可能 です。
➡ Update()ではなくFixedUpdate()でRigidbodyを制御
➡ Time.deltaTimeではなくTime.fixedDeltaTimeを使用する
//FixedUpdate() の使用例(Rigidbody の移動)
void FixedUpdate()
{
Rigidbody rb = GetComponent<Rigidbody>();
rb.velocity = new Vector3(0, 0, 5);
}
LateUpdate() の使い方
LateUpdate()
- 実行タイミング:Update後
- 主な用途:カメラ追従、演出の後処理
void LateUpdate() {
transform.position = player.position + offset;
}
ライフサイクルの使い分けまとめ
関数名 | 実行タイミング | 主な用途 | 備考 |
---|---|---|---|
Awake() | オブジェクト生成時 | 依存関係の初期化 | 非アクティブでも実行 |
Start() | 初回フレーム前 | 初期状態の設定 | 非アクティブでは未実行 |
Update() | 毎フレーム | ユーザー入力など | フレームレート依存 |
FixedUpdate() | 一定間隔 | Rigidbodyの制御など | 物理演算向け |
LateUpdate() | Updateの後 | カメラや演出の処理 | 最終処理向け |
まとめ
Unityのライフサイクルは、オブジェクト生成から破棄までの一連の関数呼び出しの流れ
- Awake():依存関係の初期化に使う
- Start():初期状態やコンポーネント取得に使う
- Update():プレイヤー操作やアニメーションなどフレーム単位の処理
- FixedUpdate():物理挙動やRigidbodyの制御に使う
- LateUpdate():カメラ追従や描画の後処理に使う
これらを正しく使い分けることで、バグの少ないわかりやすいスクリプトを書くことができます。