Unityでゲームやアプリを作るとき、スクリプト(プログラム)を書いてキャラクターを動かしたり、アイテムを表示させたりします。このとき、何をどのタイミングで動かすかを決めるのに役立つのが「イベント関数」です。
たとえば、「ゲームが始まったときにキャラクターを表示する」「敵にぶつかったらダメージを受ける」といったタイミングで実行したい処理があります。このタイミングを教えてくれるのがイベント関数です。
イベント関数を使いこなせるようになると、思い通りにゲームを動かせるようになります。このブログ記事では、Unity初心者の方でも理解できるように、イベント関数にはどんな種類があって、それぞれどのように使えばいいのかをわかりやすく解説していきます。
イベント関数とは?
イベント関数とは、Unityが特定のタイミングで自動的に呼び出す特別な関数のことです。たとえば、「ゲームが始まるとき」「キャラクターが何かにぶつかったとき」「毎フレーム(1秒間に数十回)処理を繰り返すとき」など、さまざまなタイミングで呼び出される関数があります。
イベント関数の役割
イベント関数は、ゲームのさまざまな出来事(イベント)に応じて、スクリプトの処理を実行する役割を果たします。これにより、ゲームが正しく動作するようにタイミングをコントロールできます。たとえば、プレイヤーがゲームを開始したときにキャラクターを表示したり、敵にダメージを与えたりする処理がイベント関数を使うことで実現できます。
Unityにおけるイベント関数の基本概念
Unityでスクリプトを書くとき、スクリプトはMonoBehaviour(モノビヘイビア)というクラスを継承します。このMonoBehaviourは、Unityの基本的な機能を提供するクラスで、イベント関数もこのクラスから継承されています。
たとえば、Start()というイベント関数は、ゲームオブジェクトがアクティブになったときに一度だけ呼び出されます。また、Update()というイベント関数は、毎フレーム呼び出され、ゲーム内で繰り返し処理を行うために使われます。
MonoBehaviourを継承したスクリプトの中に、これらのイベント関数を定義しておくと、Unityが自動的に適切なタイミングでそれらの関数を呼び出してくれます。これが、ゲームやアプリを効率的に動かすために欠かせない仕組みとなっています。
主要なイベント関数一覧
以下に、Unityのイベント関数の一覧を表形式でまとめました。
カテゴリ | イベント関数 | 説明 | 用途 |
---|---|---|---|
初期化系 | Awake() | ゲームオブジェクトが初期化されるタイミングで最初に呼ばれる | オブジェクトの初期設定や依存関係の確立 |
Start() | ゲームオブジェクトが有効化され、最初に実行されるフレームで呼ばれる | ゲーム開始時の初期化処理や設定 | |
更新系 | Update() | 毎フレーム呼び出される | ゲームロジック、ユーザー入力の処理 |
FixedUpdate() | 固定フレームレートで呼び出される | 物理演算や物理挙動の処理 | |
LateUpdate() | Update() の後に呼び出される | カメラの追従処理やアニメーションの後処理 | |
衝突検出系 | OnCollisionEnter(Collision collision) | 他のオブジェクトと衝突した際に呼び出される | 衝突時の処理やエフェクト発動 |
OnTriggerEnter(Collider other) | トリガーとして設定されたオブジェクトと接触した際に呼び出される | 特定のエリアに入った時の処理 | |
OnCollisionStay(Collision collision) | 衝突している間、毎フレーム呼び出される | 衝突中の継続的な処理 | |
OnTriggerStay(Collider other) | トリガーエリアに留まっている間、毎フレーム呼び出される | トリガー内での継続的な処理 | |
OnCollisionExit(Collision collision) | 衝突が終了した際に呼び出される | 衝突終了時の処理 | |
OnTriggerExit(Collider other) | トリガーエリアから出た際に呼び出される | トリガーエリア退出時の処理 | |
その他 | OnEnable() | オブジェクトが有効化されたときに呼び出される | オブジェクトの表示やリソースのロード |
OnDisable() | オブジェクトが無効化されたときに呼び出される | オブジェクトの非表示やリソースの解放 | |
OnDestroy() | オブジェクトが破棄される際に呼び出される | クリーンアップ処理やメモリリークの防止 | |
OnApplicationQuit() | アプリケーションが終了する際に呼び出される | アプリケーション終了時の処理 |
初期化系イベント
Awake()
Awake() は、ゲームオブジェクトが生成されたときに最初に呼び出されるイベント関数です。この関数は、他のすべてのスクリプトよりも早く実行されるため、オブジェクトの初期設定を行うのに適しています。たとえば、他のスクリプトやコンポーネントを参照して設定する処理は、Awake()で行います。
ポイント:
- ゲームオブジェクトが有効(アクティブ)かどうかに関係なく呼び出される。
- データの初期化や依存関係の設定などに最適。
Awake()はゲームオブジェクトが非アクティブの時には呼び出されるのか?
ゲーム起動時に非アクティブだったゲームオブジェクトは、Awake()は呼び出されません。
アクティブになった時に呼ばれるので注意しましょう。
Awake: この関数は常に Start 関数の前およびプレハブのインスタンス化直後に呼び出されます。(もしゲームオブジェクトがスタートアップ時に無効である場合、有効化にされるまで Awake は呼び出されません。)
Start()
Start() は、ゲームオブジェクトが有効化された後、最初のフレームで呼び出されるイベント関数です。この関数は、オブジェクトが完全に準備が整った後に実行されるため、ゲーム開始時の初期化処理を行うのに適しています。たとえば、ゲーム開始時にプレイヤーの位置を設定するなどの処理はStart()で行います。
ポイント:
- ゲームオブジェクトが有効化されて初めて呼び出される。
- 他のスクリプトやコンポーネントがすでに初期化されている状態で処理を行う。
Awake() と Start() の使い分け方
Awake()とStart()はどちらも初期化に使われますが、呼び出されるタイミングが異なるため、次のように使い分けます。
- Awake() は、オブジェクトが生成されるときに最初に呼ばれるため、スクリプト内の変数や依存関係の設定など、他のオブジェクトに依存しない処理を行うときに使います。たとえば、「このスクリプトが動く前に必ず設定しておきたい」処理はAwake()に書きます。
- Start() は、オブジェクトが有効化されたときに初めて呼ばれるため、他のオブジェクトやスクリプトがすべて準備できていることを前提にした処理を行います。たとえば、シーン内の他のオブジェクトやデータを使って、初期位置やステータスを設定するような処理はStart()に書きます。
更新系イベント
ゲーム開発では、キャラクターの動きや入力処理など、頻繁に繰り返す処理が必要です。Unityでは、これらの処理を行うために、更新系イベントと呼ばれる関数が用意されています。これらはゲームのフレームごとに呼び出され、スムーズな動きを実現します。
Update()
Update() は、毎フレーム呼び出されるイベント関数です。フレームごとに実行されるので、ゲーム内の動きや入力処理に最適です。たとえば、プレイヤーがキーボードやゲームパッドで操作する際の動きの処理は、Update()内に記述します。
主な用途:
- プレイヤーの入力処理(移動、ジャンプ、攻撃など)
- 敵やオブジェクトの動き
- タイマーの更新
FixedUpdate()
FixedUpdate() は、固定フレームレートで呼び出されるイベント関数です。これは、一定の時間間隔で実行されるため、物理演算や物理的な挙動に関わる処理に使われます。Update()はPCの性能に依存してフレームレートが変動しますが、FixedUpdate()は一定のタイミングで呼ばれるため、物理演算が正確に行えます。
主な用途:
- 物理演算(重力、衝突、力の適用など)
- Rigidbodyを使ったオブジェクトの動き
LateUpdate()
LateUpdate() は、Update()の後に呼び出されるイベント関数です。すべてのUpdate()が完了した後に実行されるので、他の処理が終わってから行いたい処理に使います。たとえば、カメラがキャラクターを追従する場合、キャラクターの動きが確定してからカメラの位置を調整するのに役立ちます。
主な用途:
- カメラの追従処理
- アニメーションや位置調整の後処理
- 他のオブジェクトの動きを基にした調整
Update()、FixedUpdate()、LateUpdate()の使い分け
- Update():毎フレーム実行されるため、プレイヤー入力や敵の動きなど、リアルタイムで反応させたい処理に使用します。
- FixedUpdate():物理演算に関連する処理は、固定フレームレートで呼ばれるFixedUpdate()に任せます。これにより、動きが安定し、予期せぬ挙動を防げます。
- LateUpdate():他の処理が完了した後に実行したい処理、特にカメラの追従などにはLateUpdate()を使用します。
衝突検出系イベント
ゲーム内では、キャラクターが敵や壁にぶつかったり、特定のエリアに入ったりすることがあります。これらの「衝突」や「接触」を検出するために、Unityでは衝突検出系イベントが用意されています。このイベントを使うことで、ゲーム内のさまざまな反応を制御できます。
OnCollisionEnter()
OnCollisionEnter() は、オブジェクト同士が衝突したときに呼び出されるイベント関数です。衝突が発生すると、自動的に呼び出され、そのときの衝突情報を使って処理を行います。
主な用途:
- キャラクターが壁や地面にぶつかったときの反応(停止、跳ね返りなど)
- 敵や障害物との衝突でダメージを受ける処理
- 衝突時にエフェクト(爆発や衝撃波)を発動させる
注意点:
- OnCollisionEnter()が動作するには、オブジェクトにRigidbody(リジッドボディ)コンポーネントが必要です。
- オブジェクトのCollider(コライダー)が物理的な衝突を検出する設定になっている必要があります。
OnTriggerEnter()
OnTriggerEnter() は、オブジェクトがトリガーとして設定されたオブジェクトと接触したときに呼び出されるイベント関数です。トリガーは物理的な衝突ではなく、あくまで「接触」を検知するためのものです。これを使うことで、特定のエリアに入ったことを検出したり、特定の条件が満たされたときにイベントを発生させたりできます。
主な用途:
- キャラクターが特定のエリアに入ったときにイベントを発生させる(ドアが開く、アイテムが出現するなど)
- チェックポイントの通過判定
- 隠しエリアに入った際の特別な効果発動
注意点:
- トリガーとして使うには、オブジェクトのColliderの「Is Trigger」オプションを有効にする必要があります。
- Rigidbodyは必須ではありませんが、動的なオブジェクトには付けたほうが良い場合があります。
OnCollisionEnter() と OnTriggerEnter() の違いと使い分け
- OnCollisionEnter() は、物理的な衝突が発生したときに使います。たとえば、プレイヤーが壁にぶつかったり、敵に体当たりしたときの処理に適しています。
- OnTriggerEnter() は、物理的な衝突ではなく、オブジェクトが特定のエリアに「入った」ことを検知するために使います。ゲーム内での進行やイベントを管理するのに便利です。
その他のイベント
Unityでは、オブジェクトが有効化・無効化されたり、破棄されたりするタイミングでもイベント関数が呼び出されます。これらのイベント関数を使うことで、状態管理やリソースの効率的な管理が可能になります。
OnEnable() / OnDisable()
OnEnable() と OnDisable() は、オブジェクトが有効化(アクティブ化)されたとき、および無効化(非アクティブ化)されたときに呼び出されるイベント関数です。これらの関数を利用することで、オブジェクトが表示されたり非表示になったりする際の処理をコントロールできます。
主な用途:
- オブジェクトが有効化されたときにリソースを読み込む(例:音楽を再生、パーティクルを表示)。
- オブジェクトが無効化されたときにリソースを解放する(例:アニメーションやエフェクトの停止)。
- オブジェクトの状態に応じて特定の処理を実行する(例:UIの表示切り替え)。
OnDestroy()
OnDestroy() は、オブジェクトが破棄される際に呼び出されるイベント関数です。オブジェクトが破棄されると、メモリ内のデータも解放されますが、これに関連するリソースやデータの後処理を行う場合にOnDestroy()を使用します。これにより、メモリリーク(不要なメモリが解放されない問題)を防ぐことができます。
主な用途:
- ゲームオブジェクトが破棄される前にデータを保存する(例:ゲームの進行状況の保存)。
- 他のオブジェクトやシステムへの参照を解除してメモリを解放する。
- ネットワーク接続やファイルのクローズなど、リソースのクリーンアップ。
OnApplicationQuit()
OnApplicationQuit() は、UnityのMonoBehaviourクラスに属するイベント関数で、アプリケーションが終了する直前に呼び出されます。この関数を使用することで、アプリケーションの終了時に必要なクリーンアップ処理や状態の保存などを行うことができます。
主な特徴
- タイミング:
- アプリケーションが終了する直前に一度だけ呼び出されます。これは、ユーザーがゲームを閉じる、エディタで再生を停止する、またはアプリケーションがクラッシュする前など、終了のトリガーが何であれ同じです。
- 用途:
- 保存処理: ゲームの進行状況や設定を保存する。
- 接続の切断: ネットワーク接続や通信を適切に終了する。
- リソースの解放: 使用中のメモリを解放する。
- 注意点:
- iOSやAndroidのアプリでは、アプリがバックグラウンドに移行する際に呼ばれるわけではないため、終了時のデータ保存などは、他のメソッド(OnApplicationPause()など)と組み合わせる必要があります。