[Unity] FixedUpdate / Update / LateUpdate 차이
유니티 라이프사이틀 업데이트 순서
- 게임로직, 상호작용, 애니메이션, 카메라 포지션의 트랙을 유지할 때 사용 가능한 몇몇 다른 이벤트가 존재합니다.
일반적인 패턴은 Update 함수에서 대부분의 작업을 수행할 수 있지만, FixedUpdate, LateUpdate도 존재합니다.
1. FixedUpdate()
1) 공식문서를 보면 Update는 한 프레임당 한번 호출이 되는데 FixecUpdate는 종종 더 자주 호출된다고 나와있습니다.
2) 프레임 속도가 낮은 경우에는 프레임당 여러번 호출 될 수 있고, 프레임 속도가 높은 경우에는 프레임 사이에 호출되지 않을 수 있습니다.
- FixedUpdate는 프레임과 관계없이 일정한 속도로 호출됨을 알 수 있습니다.
3) 유니프 사이클에서 Physics의 범주에 들어가있는것을 볼 수 있는데, 그 중 가장 위쪽에 위치하고 있습니다.
- 모든 물리 계산 및 업데이트는 FixedUpdate 후 즉시 발생합니다.
4) FixedUpdate는 프레임 속도와 관계없이 신뢰할 수 있는 타이머에서 호출되기 때문에 Time.deltaTime만큼 값을 곱할 필요가 없다고 합니다.
2. Update()
- Update는 프레임당 한 번 호출됩니다.
3. LateUpdate()
- Update가 끝난 후 프레임당 한 번 호출됩니다.
- Update에서 수행된 모든 계산은 LateUpdate가 시작할 때 완료됩니다.
- 보통 캐릭터를 따라가는 카메라를 제어할 때 LateUpdate를 사용하여 캐릭터가 완전히 움직인 이후 따라가게 끔 합니다.
스크립트의 실행순서변경
Projet Settings 창의 Script Execution Order 패널을 사용하면된다.
이해가 안되는 부분
- 동일한 MonoBehaviour 서브 클래스의 다른 인스턴스에 대해 이벤트 함수가 호출되는 순서를 지정할 수 없습니다. 예를 들어 한 MonoBehaviour의 Update 함수는 다른 게임 오브젝트(해당 부모 또는 자식 게임 오브젝트 포함)의 동일한 MonoBehaviour에 대해 Update 함수 전후에 호출될 수 있다.
일반적으로 순서가 명시적으로 문서화되거나 설정 가능한 경우를 제외하고, 다른 게임 오브젝트에 대해 동일한 이벤트 함수가 호출되는 순서를 사용해서는 안된다.(플레이어 루프를 보다 세세하게 제어해야 하는 경우 PlayerLoop API(https://docs.unity3d.com/kr/current/ScriptReference/LowLevel.PlayerLoop.html)를 사용할 수 있다.)