Version: Unity 6.0 (6000.0)
언어 : 한국어
이벤트 함수
Customizing the Player loop

이벤트 함수의 실행 순서

이벤트 함수는 MonoBehaviour 스크립트가 적절한 메서드를 구현하여 선택적으로 구독할 수 있는 빌트인 이벤트 세트로, 콜백이라고 부릅니다. 콜백은 물리, 렌더링, 사용자 입력을 비롯한 핵심 Unity 하위 시스템의 이벤트 또는 생성, 활성화, 프레임별 및 프레임 독립 업데이트, 파괴 등과 같은 스크립트 자체 수명 주기 단계에 해당합니다. 이벤트가 발생하면 Unity는 스크립트에서 관련 콜백을 호출하여 이벤트에 대한 응답으로 로직을 구현할 기회를 제공합니다.

Unity가 이러한 이벤트를 발생시키고 관련 MonoBehaviour 콜백을 사전 지정된 순서로 호출하며 그 순서는 여기에 문서화되어 있습니다. 아직 호출되지 않은 다른 콜백에 의존하는 작업을 수행하기 위해 하나의 콜백을 사용하지 않으려면 실행 순서를 이해하는 것이 중요합니다. 그러나 일부 콜백은 게임 실행 중 언제든지 발생할 수 있는 이벤트(예: 사용자 입력으로 트리거된 이벤트)를 대상으로 합니다. 각 이벤트의 의미와 제한 사항을 완전히 이해하기 위해 이 페이지를 MonoBehaviour 스크립트 레퍼런스(여기서 이벤트 콜백은 메시지 아래에 나열되어 있음)와 함께 읽어야 합니다.

스크립트 라이프사이클 개요

아래 다이어그램은 Unity가 스크립트의 수명 주기 동안 이벤트 함수의 순서를 지정하고 반복하는 방법을 요약합니다.

다양한 이벤트 함수에 관한 자세한 내용은 다음 섹션을 참조하십시오.

플로우차트의 범위

아래 플로우차트의 범위는 MonoBehaviour 스크립팅 레퍼런스의 메시지에 문서화된 적절한 콜백을 구현하여 모든 MonoBehaviour 스크립트에서 구독할 수 있는 빌트인 이벤트 함수로 제한됩니다. 또한 이벤트를 발생시키는 하위 시스템의 일부 추가 내부 메서드도 컨텍스트에 표시됩니다.

이러한 빌트인 이벤트 기능 외에도 스크립트에서 구독할 수 있는 다양한 이벤트가 있습니다. Application, SceneManager, Camera 같은 여러 주요 클래스에서 직접 콜백 메서드를 등록할 수 있는 델리게이트를 제공합니다. RuntimeInitializeOnLoadMethodAttribute 같은 메서드 속성을 사용하여 씬의 특정 단계에서 메서드를 실행할 수도 있습니다. 어떤 이벤트 콜백을 구독할 수 있는지와 이벤트 콜백 실행 순서에 대한 세부 정보를 확인하려면 관심이 있는 컴포넌트 또는 하위 시스템의 스크립팅 레퍼런스를 참조하십시오.

스크립트 라이프사이클 플로우차트

참고: 일부 브라우저에서는 SVG 이미지 파일을 지원하지 않습니다. 위 이미지가 올바르게 표시되지 않는 경우(예를 들어 텍스트가 보이지 않는 경우) Google Chrome 또는 Mozilla Firefox 등 다른 브라우저를 사용해 보십시오.

일반 원칙

일반적으로 순서가 명시적으로 문서화되거나 설정 가능한 경우를 제외하고 다른 게임 오브젝트에 동일한 이벤트 함수가 호출되는 순서를 남용해서는 안 됩니다. 플레이어 루프를 보다 세밀하게 제어해야 하는 경우에는 PlayerLoop API를 사용하면 됩니다.
동일한 MonoBehaviour 서브 클래스의 다른 인스턴스에 이벤트 함수가 호출되는 순서를 지정할 수 없습니다. 예를 들어, 한 MonoBehaviour의 Update 함수는 부모 또는 자식 게임 오브젝트를 비롯한 다른 게임 오브젝트의 동일한 MonoBehaviour에 대한 Update 함수 이전 또는 이후에 호출될 수 있습니다.

Project Settings 창의 Script Execution Order 패널을 사용하여 한 MonoBehaviour 하위 클래스의 이벤트 함수를 다른 하위 클래스의 이벤트 함수 이전에 호출하도록 지정할 수 있습니다. 예를 들어 EngineBehaviour와 SteeringBehaviour라는 두 개의 스크립트가 있는 경우, EngineBehaviour가 SteeringBehaviour 이전에 항상 업데이트되도록 스크립트 실행 순서를 설정할 수 있습니다. 여러 씬을 추가적으로 로드하는 경우 구성된 스크립트 실행 순서는 씬 간에 부분적으로 적용되지 않고 한 번에 전체 씬에 적용되므로 EngineBehaviour와 SteeringBehaviour는 다음 씬에서 업데이트하기 전에 한 씬에서 모두 업데이트됩니다.

첫 번째 씬 로드

다음 함수는 씬이 시작할 때(씬에서 오브젝트마다 한 번) 호출됩니다.

  • Awake: 오브젝트의 새 인스턴스가 생성될 때 호출되는 첫 번째 수명 주기 함수입니다. 항상 Start 함수 이전에 호출됩니다. 시작하는 동안 게임 오브젝트가 비활성화되어 있으면 활성화되기 전까지는 Awake가 호출되지 않습니다.
  • OnEnable: 오브젝트가 활성화되고 활성 상태가 될 때 호출되며, 항상 Awake 이후(동일한 오브젝트에서)와 Start 전에 호출됩니다.

씬 에셋의 일부인 오브젝트의 경우, Start 전에 모든 스크립트의 AwakeOnEnable 함수가 호출되고, 그중 _어느 하나_에 후속 함수가 호출됩니다. 그러나 런타임 시 오브젝트를 인스턴스화할 때는 이를 적용할 수 없습니다.

Awake는 각 개별 오브젝트의 범위에서 OnEnable 전에만 호출되도록 보장됩니다. 여러 오브젝트의 순서는 결정론적이지 않으며 한 오브젝트의 Awake가 다른 오브젝트의 OnEnable보다 먼저 호출된다고는 확신할 수 없습니다. 씬의 모든 오브젝트에 호출된 Awake에 의존하는 모든 작업은 Start에서 수행되어야 합니다.

씬 로드 및 언로드 전

위 다이어그램에는 각각 씬이 로드되고 언로드될 때 콜백을 수신할 수 있는 SceneManager.sceneLoadedSceneManager.sceneUnloaded 이벤트가 표시되어 있지 않습니다. 자세한 내용과 사용 예시는 관련 스크립팅 레퍼런스 페이지를 참조하십시오. 씬의 모든 오브젝트에서 OnEnable 이후 Start 이전에 sceneLoaded 알림을 받을 수 있습니다. 실행 흐름의 일부로 씬 로드를 포함하는 다이어그램의 경우 도메인 및 씬 재로드 비활성화에 대한 세부 정보를 참조하십시오.

또한 RuntimeInitializeOnLoadMethodAttributeBeforeSceneLoadAfterSceneLoad 유형을 사용하여 씬 로드 전 또는 후에 각각 메서드를 실행할 수도 있습니다. 이 유형으로 표시된 메서드에 대한 실행 순서 정보는 RuntimeInitializeOnLoadMethodAttribute 스크립팅 레퍼런스 메인 페이지를 참조하십시오.

에디터

  • Reset: 오브젝트에 처음 연결하거나 Reset 커맨드를 사용할 때 스크립트의 프로퍼티를 초기화하기 위해 호출됩니다.
  • OnValidate: 오브젝트가 역직렬화될 때를 포함하여 스크립트의 프로퍼티가 설정될 때마다 호출되며, 이는 에디터에서 씬을 열 때와 도메인을 다시 로드한 후 등 다양한 시기에 발생할 수 있습니다.

첫 번째 프레임 업데이트 전에

  • Start: 스크립트 인스턴스가 활성화된 경우에만 첫 번째 프레임 업데이트 전에 호출됩니다.

씬 에셋의 일부인 오브젝트의 경우 Update가 호출되기 전에 모든 스크립트에서 Start 함수가 호출됩니다. 그러나 게임플레이 중에 오브젝트를 인스턴스화할 때는 이를 적용할 수 없습니다. 예를 들어 다른 오브젝트의 Update 함수에서 오브젝트를 인스턴스화하면 원래 오브젝트에서 처음으로 Update가 실행될 때까지 인스턴스화된 오브젝트의 Start가 호출되지 않습니다.

프레임 사이

  • OnApplicationPause: 일반 프레임 업데이트 사이에 일시 정지가 감지된 프레임의 끝에서 호출됩니다. 게임이 일시 중지 상태를 나타내는 그래픽스를 표시할 수 있도록 OnApplicationPause가 호출된 후에 추가 프레임이 표시됩니다.

업데이트 순서

게임 로직과 상호 작용, 애니메이션, 카메라 위치 등을 추적할 때 사용할 수 있는 다양한 이벤트가 있습니다. 일반적인 패턴은 Update 함수 내에서 대부분의 작업을 수행하는 것이지만 사용할 수 있는 다른 함수도 있습니다.

  • FixedUpdate는 프레임 단위가 아닌 게임 내 시간의 일정 간격으로 발생합니다. 이러한 업데이트는 고정되어 있고 프레임 속도는 변수이므로 프레임 속도가 빠를 때 프레임 동안 고정 업데이트가 없거나 프레임 속도가 느릴 때 프레임당 여러 개의 고정 업데이트가 발생할 수 있습니다. 모든 물리 계산 및 업데이트는 FixedUpdate 후 즉시 수행되며, 프레임 속도와 독립적이기 때문에 FixedUpdate에서 움직임을 계산할 때 값에 Time.deltaTime을 곱할 필요가 없습니다. 고정 업데이트가 발생하는 간격은 스크립트에서 직접 설정하거나 에디터의 Time settings에서 Fixed Timestep 프로퍼티를 통해 설정할 수 있는 Time.fixedDeltaTime으로 정의합니다. Update 또는 FixedUpdate 수행 여부를 결정하는 데 사용되는 시간 계산을 비롯한 자세한 내용은 시간을 참조하십시오.

  • Update는 프레임당 한 번 호출되며 프레임 업데이트를 위한 주요 함수입니다.

  • Update가 끝난 후 프레임당 한 번씩 LateUpdate가 호출됩니다. Update에서 수행하는 모든 계산은 LateUpdate 시작 시 완료됩니다. LateUpdate의 일반적인 용도는 다음의 3인칭 카메라입니다. Update 안에서 캐릭터를 이동하고 회전하면 모든 카메라 이동 및 회전 계산을 LateUpdate에서 수행할 수 있습니다. 그러면 카메라가 위치를 추적하기 전에 캐릭터가 완전히 움직였는지 확인할 수 있습니다.

애니메이션 업데이트 루프

위의 플로우차트에 표시된 다음 애니메이션 루프 콜백은 MonoBehaviour에서 파생된 스크립트에서 호출됩니다.

추가 애니메이션 관련 이벤트 함수는 StateMachineBehaviour에서 파생된 스크립트에서 호출됩니다.

이러한 콜백의 의미와 제한 사항은 관련 스크립팅 레퍼런스 페이지를 참조하십시오.

플로우차트에 표시된 다른 애니메이션 함수는 애니메이션 시스템 내부에 있으며 컨텍스트를 위해 제공됩니다. 이러한 함수에는 프로파일러 마커가 연결되어 있으므로 프로파일러를 사용하여 프레임에서 Unity가 호출하는 시점을 확인할 수 있습니다. Unity가 이러한 함수를 호출하는 시점을 알면 호출하는 이벤트 함수가 정확히 실행되는 시점을 파악할 수 있습니다. 애니메이션 함수 및 프로파일러 마커의 전체 실행 순서는 프로파일러 마커를 참조하십시오.

렌더링

이 실행 순서는 빌트인 렌더 파이프라인에만 적용됩니다. 스크립터블 렌더 파이프라인을 기반으로 하는 렌더 파이프라인의 실행 순서에 대한 자세한 내용은 유니버설 렌더 파이프라인 또는 고해상도 렌더 파이프라인에 대한 기술 자료의 관련 섹션을 참조하십시오. 렌더링 직전에 작업을 수행하려면 Application.onBeforeRender를 참조하십시오.

  • OnPreCull: 카메라가 씬을 컬링하기 전에 호출됩니다. 컬링에 따라 카메라에 보이는 오브젝트가 결정됩니다. 컬링 직전에 OnPreCull이 호출됩니다.
  • OnBecameVisible/OnBecameInvisible: 오브젝트가 카메라에 보이거나 보이지 않을 때 호출됩니다. 오브젝트가 언제든지 보이지 않을 수 있으므로 OnBecameInvisible은 위 플로우차트에 표시되어 있지 않습니다.
  • OnWillRenderObject: 오브젝트가 표시되면 각 카메라에 한 번 호출됩니다.
  • OnPreRender: 카메라가 씬 렌더링을 시작하기 전에 호출됩니다.
  • OnRenderObject: 모든 일반 씬 렌더링이 완료된 후 호출됩니다. 이 지점에서 커스텀 지오메트리를 그리려면 GL 클래스나 Graphics.DrawMeshNow를 사용하면 됩니다.
  • OnPostRender: 카메라가 씬 렌더링을 마친 후 호출됩니다.
  • OnRenderImage: 이미지의 포스트 프로세싱이 가능하도록 씬 렌더링이 완료된 후 호출됩니다. 포스트 프로세싱 효과를 참조하십시오.
  • OnGUI: GUI 이벤트에 대한 응답으로 프레임당 여러 번 호출됩니다. 레이아웃 및 리페인트 이벤트는 우선 처리되며, 그 다음에 각 입력 이벤트에 레이아웃 및 키보드/마우스 이벤트가 처리됩니다.
  • OnDrawGizmos 시각화 목적으로 씬 뷰에 기즈모를 그릴 때 사용됩니다.

참고: OnPreCull, OnPreRender, OnPostRender, OnRenderImage는 MonoBehaviour 스크립트에서 호출되는 빌트인 Unity 이벤트 함수이지만, 해당 스크립트가 활성화된 Camera 컴포넌트와 동일한 오브젝트에 연결된 경우에만 호출됩니다. 다른 오브젝트에 연결된 MonoBehaviour의 OnPreCull, OnPreRender, OnPostRender에 동등한 콜백을 수신하려면, 해당 스크립팅 레퍼런스의 관련 페이지에 있는 코드 예시 같이 Camera.onPreCull, Camera.onPreRender, Camera.onPostRender의 동등한 델리게이트(이름에 소문자 on 있음)를 사용해야 합니다.

코루틴

일반 코루틴 업데이트는 Update 함수가 반환된 후 실행됩니다. 코루틴은 주어진 YieldInstruction이 완료될 때까지 실행(yield)을 일시 중지할 수 있는 함수입니다.

코루틴의 다른 사용법은 다음과 같습니다.

  • yield 코루틴은 모든 Update 함수가 다음 프레임에 호출된 후 계속 진행됩니다.
  • yield WaitForSeconds 모든 Update 함수가 프레임에 호출된 후 지정한 시간이 지난 후 계속 진행됩니다.
  • yield WaitForFixedUpdate 모든 스크립트에서 모든 FixedUpdate가 호출된 후 계속 진행됩니다. 코루틴이 FixedUpdate 이전에 발생하면 현재 프레임에서 FixedUpdate 이후에 다시 시작됩니다.
  • yield WWW WWW 다운로드가 완료된 후 계속 진행됩니다.
  • yield StartCoroutine 코루틴을 체이닝하여 이론 코루틴 coroutineAyield StartCoroutine(coroutineB());으로 다른 코루틴 coroutineB를 시작하면 coroutineA는 일시 중지하고 coroutineB가 완료될 때까지 기다린 후 계속 진행합니다. 예시는 MonoBehaviour.StartCoroutine을 참조하십시오.

오브젝트를 파괴할 때

  • OnDestroy: 이 함수는 오브젝트가 존재하는 마지막 프레임에 모든 프레임 업데이트를 마친 후 호출됩니다(오브젝트는 Object.Destroy 또는 씬 종료에 대한 응답으로 파괴될 수 있음).

종료할 때

다음 함수는 씬의 활성화된 모든 오브젝트에서 호출됩니다.

  • OnApplicationQuit: 이 함수는 애플리케이션이 종료되기 전에 모든 게임 오브젝트에서 호출됩니다. 에디터에서 사용자가 플레이 모드를 중지하면 호출됩니다.
  • OnDisable: 동작이 비활성화되거나 비활성 상태가 되면 이 함수가 호출됩니다.

추가 리소스

이벤트 함수
Customizing the Player loop
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961