Update와 FixedUpdate
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요!
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요!
Update()
Update()는 게임이 실행되는 동안 화면의 프레임이 갱신될 때마다 한 번씩 호출되는 메서드입니다. 컴퓨터 성능이나 게임 상황에 따라 프레임 속도가 달라지므로 호출 횟수도 일정하지 않습니다. 예를 들어 게임이 60FPS로 실행되면 약 1초에 60번, 30FPS라면 약 30번 호출됩니다. 따라서 키보드·마우스 입력 확인, 일반적인 게임 규칙 처리, 타이머, UI 갱신처럼 매 화면 프레임마다 확인해야 하는 로직을 작성할 때 적합합니다.
FixedUpdate()
FixedUpdate()는 화면 프레임이 아니라 물리 시스템의 고정된 시간 간격에 맞춰 호출되는 메서드입니다. 유니티의 기본 Fixed Timestep은 0.02초이므로, 기본 설정에서는 초당 약 50번 물리 업데이트가 실행됩니다. 이 값은 Time.fixedDeltaTime으로 확인할 수 있으며, 프로젝트 설정의 Time > Fixed Timestep에서 변경할 수 있습니다.
Update()와 FixedUpadte()의 차이
두 메서드의 가장 큰 차이는 호출 기준입니다. Update()는 화면이 그려지는 프레임을 기준으로 실행되고, FixedUpdate()는 물리 시뮬레이션의 고정 시간 단계를 기준으로 실행됩니다.
따라서 일반적으로 다음과 같이 구분합니다.
Update(): 사용자 입력, UI, 타이머, 일반 게임 로직FixedUpdate(): Rigidbody 이동, 힘 적용, 물리 상태 변경LateUpdate(): 카메라 추적처럼 다른 오브젝트의 이동이 끝난 후 처리할 로직입력은 Update()에서 확인하는 것이 좋습니다. 특히 키를 누른 순간에만 참이 되는 입력은 FixedUpdate()의 호출 시점 사이에서 발생하면 놓칠 가능성이 있기 때문입니다. 입력 결과를 변수에 저장하고 실제 물리 연산은 FixedUpdate()에서 처리하는 방식이 안전합니다.
| 비교 항목 | Update() | FixedUpdate() |
|---|---|---|
| 호출 기준 | 화면 렌더링 프레임 | 물리 시스템의 고정 시간 단계 |
| 호출 간격 | 프레임 속도에 따라 변함 | 설정된 간격을 기준으로 일정함 |
| 기본 호출 빈도 | FPS에 따라 달라짐 | 기본 약 0.02초마다, 초당 약 50회 |
| 한 화면 프레임 내 호출 | 보통 한 번 | 0번, 한 번 또는 여러 번 가능 |
| 시간값 | Time.deltaTime | Time.fixedDeltaTime |
| 주요 용도 | 입력, UI, 타이머, 일반 게임 로직 | Rigidbody 이동 및 물리 연산 |
| 입력 확인 | 적합 | 순간 입력을 놓칠 수 있어 부적합 |
transform 이동 | 비물리 오브젝트 이동에 사용 가능 | 일반적으로 필요하지 않음 |
MovePosition() | 권장하지 않음 | 권장 |
AddForce() | 지속적인 힘 적용에는 부적합 | 권장 |
| 속도 변경 | 입력값 계산·저장 | linearVelocity 등에 결과 반영 |
| 프레임 속도의 영향 | 호출 횟수가 FPS의 영향을 받음 | 물리 시간 간격을 기준으로 처리 |
Rigidbody의 물리 상태를 변경하는 메서드와 로직 중에서 내부 연산을 수행하는 메서드들을 FixedUpdate에서 실행합니다.
Update()는 화면이 렌더링될 때마다 실행되므로 컴퓨터 성능과 프레임 속도에 따라 호출 횟수가 달라집니다. 반면 FixedUpdate()는 기본적으로 0.02초마다 실행되며, 각각의 호출이 끝난 후 물리 시뮬레이션이 진행됩니다.
따라서 지속적인 힘을 Update()에서 적용하면 프레임 속도가 높은 환경에서는 힘이 더 자주 적용되고, 프레임 속도가 낮은 환경에서는 더 적게 적용될 수 있습니다. 이 경우 컴퓨터의 성능에 따라 물리 움직임이 달라질 가능성이 있습니다.
// 권장하지 않는 방식
void Update()
{
rb.AddForce(Vector2.right * moveForce);
}
// 물리 주기에 맞춘 방식
void FixedUpdate()
{
rb.AddForce(Vector2.right * moveForce);
}
| 메서드·속성 | 기능 | 일반적인 사용 위치 |
|---|---|---|
AddForce() | Rigidbody에 힘을 가해 이동 속도를 변화시킴 | FixedUpdate() |
AddTorque() | Rigidbody에 회전력을 가함 | FixedUpdate() |
MovePosition() | Rigidbody를 지정한 위치로 이동시킴 | FixedUpdate() |
MoveRotation() | Rigidbody를 지정한 각도로 회전시킴 | FixedUpdate() |
linearVelocity | 현재 이동 속도를 확인하거나 직접 변경함 | 물리 제어 시 FixedUpdate() |
angularVelocity | 현재 회전 속도를 확인하거나 직접 변경함 | 물리 제어 시 FixedUpdate() |
Sleep()·WakeUp() | Rigidbody의 물리 시뮬레이션을 일시 정지하거나 다시 활성화함 | 필요한 시점에 한 번 호출 |
IsTouching() | 다른 Collider와 접촉 중인지 확인함 | 물리 상태 확인 시 사용 |
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다

게임 광고 수익은 단순히 광고를 붙이는 것이 아니라, 여러 광고 네트워크를 경쟁시켜 가장 높은 수익을 만드는 구조입니다.

안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다



게임 광고 수익은 단순히 광고를 붙이는 것이 아니라, 여러 광고 네트워크를 경쟁시켜 가장 높은 수익을 만드는 구조입니다.


안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.