# 이벤트 함수

> 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)
