# イベント関数

> Event functions are a set of built-in callbacks which you can implement on your MonoBehaviour-derived scripts to respond to core Engine events related to physics, rendering, input, scene loading, and object lifecycles.

イベント関数は、すべての [MonoBehaviour](/engine/6000.0/manual/scripting/get-started/fundamental-unity-types/class-mono-behaviour.md) スクリプトコンポーネントが受信できる事前定義されたコールバックのセットです。コールバックは、以下のようなさまざまな Unity エディターおよびエンジンのイベントによってトリガーされます。

* [定期的なフレームおよび物理演算の更新](#regular-updates)
* オブジェクトの [ライフサイクルイベント](#initialization-events)。シーン内のオブジェクトの初期化や破棄など。
* [UI イベント](#gui-events)
* [物理挙動イベント](#physics-events)

`MonoBehaviour` の派生クラスに適切なメソッドシグネチャを実装し、ゲームオブジェクトがソースイベントに反応できるようにします。

使用可能なコールバックの完全なリストについては、[MonoBehaviour](/engine/6000.0/script-reference/unity-engine/mono-behaviour.md) スクリプティング API リファレンスのページを参照してください。**メッセージ** にリストされています。このセクションの残りの部分では、イベント関数の主要なグループの概要を説明します。

## 定期更新イベント

ゲームはアニメーションに似ていますが、その場でアニメーションフレームが生成されます。ゲームプログラミングにおける重要な概念は、各フレームがレンダリングされる直前にオブジェクトの位置、状態、動作を変更するということです。[Update](/engine/6000.0/script-reference/unity-engine/mono-behaviour/update.md) 関数は、Unity でこのようなコードのために使用される主な場所です。`Update` は、フレームがレンダリングされる前と、アニメーションが計算される前に呼び出されます。

```lang-csharp
void Update() {
	float distance = speed * Time.deltaTime * Input.GetAxis("Horizontal");
	transform.Translate(Vector3.right * distance);
}
```

物理演算エンジンもフレームレンダリングと同様に、離散的な時間ステップで更新を行います。物理演算の更新の直前に別のイベント関数である [FixedUpdate](/engine/6000.0/script-reference/unity-engine/mono-behaviour/fixed-update.md) が呼び出されます。物理演算の更新とフレームの更新は同じ頻度では発生しないので、物理コードを `Update` 関数ではなく `FixedUpdate` 関数に配置することでより正確な結果が得られます。

```lang-csharp
void FixedUpdate() {
	Vector3 force = transform.forward * driveForce * Input.GetAxis("Vertical");
	rigidbody.AddForce(force);
}
```

`Update` と `FixedUpdate` がシーン上のすべてのオブジェクトに対して呼び出され、すべてのアニメーションが計算された後、追加変更ができると便利な場合があります。このシナリオには以下のような例があります。

* カメラをターゲットオブジェクトに向け続ける必要がある場合。カメラの向きの調整は、ターゲットオブジェクトが移動した後に行う必要があります。
* スクリプトコードがアニメーションの効果をオーバーライドする場合。例えば、キャラクターの頭の向きがシーン内のターゲットオブジェクトのほうを見ているようにします。

このような状況では、[LateUpdate](/engine/6000.0/script-reference/unity-engine/mono-behaviour/late-update.md) 関数が使用できます。

```lang-csharp
void LateUpdate() {
	Camera.main.transform.LookAt(target.transform);
}
```

## 初期化イベント

ゲームプレイ中の更新の前に、初期化コードを呼び出しできると便利です。[Start](/engine/6000.0/script-reference/unity-engine/mono-behaviour/start.md) 関数はオブジェクトの最初のフレームまたは物理演算の更新の前に呼び出されます。[Awake](/engine/6000.0/script-reference/unity-engine/mono-behaviour/awake.md) 関数はシーンのロード時にシーンの各オブジェクトで呼び出されます。さまざまなオブジェクトの `Start` と `Awake` 関数が任意の順番で呼び出されますが、すべての `Awake` 関数のインスタンスは最初の `Start` 呼び出しより前に完了します。つまり `Start` 関数のコードは `Awake` フェーズで行われた初期化の結果を活用することができます。

## GUI イベント

Unity には、シーンの主なアクションの GUI コントロールをレンダリングし、コントロールに対するクリックに反応するためのシステムがあります。このコードは通常のフレーム更新とは別にハンドルされるため、定期的に呼び出される [OnGUI](/engine/6000.0/script-reference/unity-engine/mono-behaviour/on-gui.md) 関数に配置します。

```lang-csharp
void OnGUI() {
	GUI.Label(labelRect, "Game Over");
}
```

また、シーンに表示されているゲームオブジェクトに対するマウスイベントを検知できます。これは武器で狙いを定めたり現在マウスポインターの下にあるキャラクターに関する情報を表示したりするのに使用できます。プレフィックス `OnMouse` ([OnMouseOver](/engine/6000.0/script-reference/unity-engine/mono-behaviour/on-mouse-over.md)、[OnMouseDown](/engine/6000.0/script-reference/unity-engine/mono-behaviour/on-mouse-down.md) など) を持つ一連のイベント関数により、スクリプトはマウスによるユーザーアクションに反応できます。例えば、特定のオブジェクト上でマウスボタンが押されたときに、オブジェクトのスクリプトに `OnMouseDown` 関数があると呼び出されます。

## 物理挙動イベント

物理演算エンジンは、オブジェクトのスクリプトでイベント関数を呼び出すことによって、そのオブジェクトに対する衝突をレポートします。[OnCollisionEnter](/engine/6000.0/script-reference/unity-engine/mono-behaviour/on-collision-enter.md)、[OnCollisionStay](/engine/6000.0/script-reference/unity-engine/mono-behaviour/on-collision-stay.md)、[OnCollisionExit](/engine/6000.0/script-reference/unity-engine/mono-behaviour/on-collision-exit.md) 関数は、接触の発生時、接触の継続中、接触の終了時に呼び出されます。対応する [OnTriggerEnter](/engine/6000.0/script-reference/unity-engine/mono-behaviour/on-trigger-enter.md)、[OnTriggerStay](/engine/6000.0/script-reference/unity-engine/mono-behaviour/on-trigger-stay.md)、[OnTriggerExit](/engine/6000.0/script-reference/unity-engine/mono-behaviour/on-trigger-exit.md) 関数は、オブジェクトのコライダーがトリガー (物理的に反応するのではなく、何かが侵入したときに検出のみを行うコライダー) として設定されているときに呼び出されます。物理演算の更新中に複数の接触が検出された場合、これらの関数が連続して複数回呼び出されることがあります。そのため、衝突の詳細 (位置、衝突するオブジェクトの ID など) を示すパラメーターが関数に渡されます。

```lang-csharp
void OnCollisionEnter(Collision collision) {
	if (collision.gameObject.tag == "Arrow") {
		ApplyDamage(10);
	}
}
```

## 追加リソース

* [MonoBehaviour](/engine/6000.0/manual/scripting/get-started/fundamental-unity-types/class-mono-behaviour.md)
* [イベント関数の実行順](/engine/6000.0/manual/scripting/object-oriented-development/event-handling/execution-order.md)
* [MonoBehaviour API リファレンス](/engine/6000.0/script-reference/unity-engine/mono-behaviour.md)
