Unity에서는
Update(), LateUpdate(), FixedUpdate() 3가지 메소드를 제공합니다.
해당 메소드의 차이에
Update()
호출 시점: 매 프레임마다 호출됩니다.
여기서 프레임은 사용자의 하드웨어 성능에 따라 프레임 호출 수가 달라지므로 일정한 동작을 보장하기 위해 `Time.deltaTime` 을 사용해야 합니다.
Time.deltaTime
이전 프레임과 현재 프레임 사이의 시간 간격(초 단위)을 반환합니다.
사용 예시
1. 사용자 입력 처리
void Update() {
float move = Input.GetAxis("Horizontal");
transform.Translate(Vector3.right * move * Time.deltaTime);
}
2. 애니메이션 업데이트
캐릭터 애니메이션을 매 프레임마다 확인하고 수정 가능 하여 유용하다.
3. 게임 로직
적의 AI 로직이나 점수 계산 등의 지속적인 업데이트 상황에 적합하다.
Update 메서드는 기본적으로 사용자의 GPU 성능과 디스플레이 환경에 따라 호출되며, 이는 프로젝트 설정(Application.targetFrameRate 또는 VSync)으로 조정할 수 있습니다.
Application.targetFrameRate
Unity에서 목표 프레임 속도를 설정할 수 있는 프로퍼티입니다.
예를 들어, Application.targetFrameRate = 30;로 설정하면 게임이 최대 30FPS로 실행되도록 Unity가 시도합니다.
이 설정은 하드웨어 성능이나 시스템 부하에 따라 완전히 보장되지 않을 수 있습니다.
VSync (Vertical Synchronization)
VSync가 활성화된 경우, Unity는 디스플레이의 리프레시 속도에 맞춰 프레임을 렌더링합니다.
예를 들어, VSync가 활성화된 상태에서 60Hz 모니터를 사용하면 최대 60FPS로 제한됩니다.
LateUpdate()
호출 시점: 모든 Update가 호출된 이후 실행된다
용도: 다른 오브젝트에 종속적인 작업을 처리하거나 최종 결과를 기반으로 작업을 수행할 때 사용
사용 예시
1. 카메라 추적
public Transform player;
private Vector3 offset;
void Start() {
offset = transform.position - player.position;
}
void LateUpdate() {
transform.position = player.position + offset;
}
2. 오브젝트 간 종속 관계 처리
다른 오브젝트가 캐릭터를 따라가야 하는 경우 등에서 사용
FixedUpdate()
호출 시점: 고정된 시간 간격마다 호출되며, 물리 엔진과 동기화
용도: 물리 연산(Rigidbody 등) 및 일정한 시간 간격이 필요한 작업에 사용된다.
시간 간격: Time.fixedDeltaTime을 통해 고정된 시간 간격 확인 가능
사용 예시
1. 물리 기반 움직임 처리
public Rigidbody rb;
public float speed;
void FixedUpdate() {
float move = Input.GetAxis("Horizontal");
rb.MovePosition(rb.position + Vector3.right * move * speed * Time.fixedDeltaTime);
}
2. 충돌 및 힘 적용
물리 엔진에서 충돌 감지 및 힘 적용은 프레임 적용 속도와 무관하게 일정하게 유지되어야 하므로 FixedUpdate에서 처리한다.
3. 정확한 물리 시뮬레이션
프레임이 저하되는 경우에서도 물리 계산은 일정한 간격으로 이루어져야 한다.
메소드 | 호출 빈도 | 주요 용도 | 시간 간격 |
Update | 매 프레임 호출 | 사용자 입력 처리, 게임 로직 | 변동 가능 (프레임 속도 의존) |
LateUpdate | 매 프레임 호출되지만 Update 후 | 카메라 추적, 종속적 움직임 처리 | 변동 가능 (프레임 속도 의존) |
FixedUpdate | 고정된 시간 간격마다 호출 | 물리 연산 및 Rigidbody 관련 작업 | 고정 (기본값 0.02초) |