Unity 스크립트를 실행하면 사전에 지정한 순서대로 여러 개의 이벤트 함수가 실행됩니다. 이 페이지에서는 이러한 이벤트 함수를 소개하고 실행 시퀀스에 어떻게 포함되는지 설명합니다.
아래 다이어그램은 Unity가 스크립트의 수명 주기 동안 이벤트 함수의 순서를 지정하고 반복하는 방법을 요약합니다.
다양한 이벤트 함수에 관한 자세한 내용은 다음 섹션을 참조하십시오.
참고: 일부 브라우저에서는 SVG 이미지 파일을 지원하지 않습니다. 위 이미지가 올바르게 표시되지 않는 경우(예를 들어 텍스트가 보이지 않는 경우) Google Chrome 또는 Mozilla Firefox 등 다른 브라우저를 사용해 보십시오.
다음 함수는 씬이 시작할 때(씬에서 오브젝트마다 한 번) 호출됩니다.
씬에 추가된 모든 오브젝트에 대해 Start, Update 등 이전에 호출된 모든 스크립트를 위한 Awake 및 OnEnable 함수가 호출됩니다. 따라서 게임플레이 도중 오브젝트를 인스턴스화될 때는 실행되지 않습니다.
씬 에셋에 포함된 모든 오브젝트에 대해 Update 등 이전에 호출된 모든 스크립트를 위한 Start 함수가 호출됩니다. 따라서 게임플레이 도중 오브젝트를 인스턴스화될 때는 실행되지 않습니다.
게임 로직, 상호작용, 애니메이션, 카메라 포지션의 트랙을 유지할 때, 사용 가능한 몇몇 다른 이벤트가 존재합니다. 일반적인 패턴은 Update 함수에 대부분의 작업을 수행하는 것이지만, 사용할 수 있는 다른 함수도 있습니다.
FixedUpdate: FixedUpdate 는 종종 Update 보다 더 자주 호출됩니다. 프레임 속도가 낮은 경우 프레임당 여러 번 호출될 수 있으며 프레임 속도가 높은 경우 프레임 사이에 호출되지 않을 수 있습니다. 모든 물리 계산 및 업데이트는 FixedUpdate 후 즉시 발생합니다. FixedUpdate 의 움직임 계산을 적용할 때 Time.deltaTime 만큼 값을 곱할 필요가 없습니다. FixedUpdate 가 프레임 속도와 관계없이 신뢰할 수있는 타이머에서 호출되기 때문입니다.
Update: Update 는 프레임당 한 번 호출됩니다. 프레임 업데이트를 위한 주요 작업 함수입니다.
LateUpdate: LateUpdate 는 Update 가 끝난 후 프레임당 한 번 호출됩니다. Update 에서 수행된 모든 계산은 LateUpdate 가 시작할 때 완료됩니다. LateUpdate 는 일반적으로 다음의 3인칭 카메라에 사용합니다. 캐릭터를 움직이고 Update 로 방향을 바꾸게 하는 경우 LateUpdate 에서 모든 카메라 움직임과 로테이션 계산을 수행할 수 있습니다. 이렇게 하면 카메라가 포지션을 추적하기 전에 캐릭터가 완전히 움직였는지 확인할 수 있습니다.
일반적으로 순서가 명시적으로 문서화되거나 설정 가능한 경우를 제외하고, 다른 게임 오브젝트에 대해 동일한 이벤트 함수가 호출되는 순서를 사용해서는 안 됩니다. (플레이어 루프를 보다 세세하게 제어해야 하는 경우 PlayerLoop API를 사용할 수 있습니다.)
동일한 MonoBehaviour 서브 클래스의 다른 인스턴스에 대해 이벤트 함수가 호출되는 순서를 지정할 수 없습니다. 예를 들어 한 MonoBehaviour의 Update 함수는 다른 게임 오브젝트(해당 부모 또는 자식 게임 오브젝트 포함)의 동일한 MonoBehaviour에 대해 Update 함수 전후에 호출될 수 있습니다.
한 MonoBehaviour 서브 클래스의 이벤트 함수가 다른 서브 클래스의 이벤트 함수 전에 호출되도록 지정할 수 있습니다(Project Settings 창의 Script Execution Order 패널 사용). 예를 들어 두 개의 스크립트(EngineBehaviour, SteeringBehaviour)가 있는 경우 EngineBehaviour가 항상 SteeringBehaviour 전에 업데이트되도록 스크립트 실행 순서를 설정할 수 있습니다.
Unity가 애니메이션 시스템을 평가할 때 이러한 함수와 프로파일러 마커가 호출됩니다.
OnStateMachineEnter: State Machine Update 단계 동안 컨트롤러의 상태 머신이 엔트리 상태를 통과하는 전환을 만들 때 이 콜백이 첫 번째 업데이트 프레임에 대해 호출됩니다. StateMachine 하위 상태에 대한 전환의 경우에는 호출되지 않습니다.
이 콜백은 Controller 컴포넌트(예: AnimatorController 또는 AnimatorOverrideController 또는 AnimatorControllerPlayable)가 애니메이션 그래프에 있을 때에만 발생합니다.
참고: 이 콜백을 StateMachineBehaviour 컴포넌트에 추가하면 멀티스레드 상태 머신 평가가 비활성화됩니다.
OnStateMachineExit: State Machine Update 단계 동안 컨트롤러의 상태 머신이 종료 상태를 통과하는 전환을 만들 때 이 콜백이 마지막 업데이트 프레임에 대해 호출됩니다. StateMachine 하위 상태에 대한 전환의 경우에는 호출되지 않습니다.
이 콜백은 Controller 컴포넌트(예: AnimaorController 또는 AnimatorOverrideController 또는 AnimatorControllerPlayable)가 애니메이션 그래프에 있을 때에만 발생합니다.
참고: 이 콜백을 StateMachineBehaviour 컴포넌트에 추가하면 멀티스레드 상태 머신 평가가 비활성화됩니다.
Fire Animation Events: 마지막 업데이트 시간과 최신 업데이트 시간 사이에 샘플링된 모든 클립에서 모든 애니메이션 이벤트를 호출합니다.
StateMachineBehaviour (OnStateEnter/OnStateUpdate/OnStateExit): 레이어가 최대 3개의 활성 상태(현재 상태, 중단된 상태, 다음 상태)를 가질 수 있습니다. 이 함수는 OnStateEnter, OnStateUpdate 또는 OnStateExit 콜백을 정의하는 StateMachineBehaviour 컴포넌트가 포함된 각 활성 상태에 대해 호출됩니다.
제일 먼저 함수가 현재 상태에 대해 호출되고 중단된 상태에 대해 호출된 후 마지막으로 다음 상태에 대해 호출됩니다.
이 단계는 Controller 컴포넌트(예: AnimatorController 또는 AnimatorOverrideController 또는 AnimatorControllerPlayable)가 애니메이션 그래프에 있을 때에만 발생합니다.
OnAnimatorMove: 업데이트 프레임마다 루트 모션을 수정할 수 있도록 각 Animator 컴포넌트에 대해 한 번 호출됩니다.
StateMachineBehaviour(OnStateMove): 이 콜백을 정의하는 StateMachineBehaviour가 포함된 각 활성 상태에 대해 호출됩니다.
OnAnimatorIK: 애니메이션 IK를 설정합니다. IK pass가 활성화된 각 애니메이터 컨트롤러 레이어에 대해 한 번 호출됩니다.
휴머노이드 릭을 사용하는 경우에만 이 이벤트가 실행됩니다.
StateMachineBehaviour(OnStateIK): IK pass가 활성화되어 있는 레이어에서 이 콜백을 정의하는 StateMachineBehaviour 컴포넌트가 포함된 각 활성 상태에 대해 호출됩니다.
WriteProperties: 다른 모든 애니메이션화된 프로퍼티를 메인 스레드에서 씬에 작성합니다.
스크립트 라이프사이클 플로우차트에 표시된 일부 애니메이션 함수는 호출할 수 없는 이벤트 함수입니다. 즉, Unity가 애니메이션을 처리할 때 호출되는 내부 함수입니다.
이 함수에는 프로파일 마커가 있으므로 프로파일러를 사용하여 프레임에서 Unity가 호출하는 시간을 확인할 수 있습니다. Unity가 이러한 함수를 호출하는 시간을 알면 호출한 이벤트 함수가 실행된 시간을 정확하게 파악하는 데 도움이 됩니다.
예를 들어 FireAnimationEvents 콜백에서 Animator.Play를 호출한다고 가정해 보겠습니다. State Machine Update 및 Process Graph 함수가 실행된 후에 FireAnimationEvents 콜백이 발동했다는 사실을 알면 애니메이션 클립이 즉시 재생되는 것이 아니라 다음 프레임에서 재생된다는 것을 예측할 수 있습니다.
State Machine Update: 이 단계에서 모든 상태 머신이 실행 시퀀스대로 평가됩니다. 이 단계는 Controller 컴포넌트(예: AnimatorController 또는 AnimatorOverrideController 또는 AnimatorControllerPlayable)가 애니메이션 그래프에 있을 때에만 발생합니다.
참고: 상태 머신 평가는 대개 멀티스레드이지만, 특정 콜백(예: OnStateMachineEnter 및 OnStateMachineExit)을 추가하면 멀티스레딩이 비활성화됩니다. 자세한 내용은 위의 애니메이션 업데이트 루프를 참조하십시오.
ProcessGraph: 모든 애니메이션 그래프를 평가합니다. 여기에는 평가할 모든 애니메이션 클립에 대한 샘플링과 루트 모션 계산이 포함됩니다.
ProcessAnimation: 애니메이션 그래프의 결과를 블렌딩합니다.
WriteTransforms: 모든 애니메이션화된 트랜스폼을 워커 스레드에서 씬에 작성합니다.
IK pass가 활성화된 여러 개의 레이어가 있는 휴머노이드 릭은 여러 개의 WriteTransforms 패스를 가질 수 있습니다(스크립트 라이프사이클 플로우차트 참조).
참고: 이러한 콜백은 빌트인 렌더 파이프라인에서만 작동합니다.
일반적인 코루틴 업데이트는 Update 함수가 반환된 후 실행됩니다. 코루틴은 주어진 YieldInstruction이 완료될 때까지 실행을 중단(양보)할 수 있는 함수입니다. 코루틴의 다른 사용법은 다음과 같습니다.
다음 함수는 씬의 활성화된 모든 오브젝트에서 호출됩니다.