Unity의 Update 메소드와 FixedUpdate의 차이점은 무엇입니까?


14

내가 Unity3d를 배우고 시작하고 내가 얻을 혼란 중 하나를 사이에 차이가 Update()FixedUpdate().

나는 Lynda Unity 2D 게임 개발 튜토리얼을 따르고 있으며 강사는 Update메소드를 사용 하고 플레이어에는 RigidBody2D 구성 요소와 Box collider가 Update있으며 플레이어를 번역하는 데 메소드를 사용 하지만 플레이어에서 동일하게 Update할 때 움직이지 않지만 내가 할 때 그 안에 FixedUpdate모든 것이 작동합니다. 그는 Unity 4.3에서 튜토리얼을 제공하고 있으며 Unity 4.6에서 강좌를 수강하고 있습니다.

어디서 사용해야 Update하고 FixedUpdate?

답변:


14

나는 이것을 주석으로 쓰려고했지만 결국 바람이 많이 걸리기 때문에 답으로 바꾸었다.

현재 답변은 대부분 정확하지만 언급 된 몇 가지 오해의 소지가 있습니다.

일반적으로 대부분의 게임 플레이 관련 작업은로 진행됩니다 Update.

예를 들어 FixedUpdate성능 때문에가 아니라 호출이 제대로 작동하지 않기 때문에 입력을 폴링하고 싶지 않습니다. AI는 같은 보트에 빠진다.

지속적으로 업데이트되는 물리는 사용해야 하는 유일한 게임 플레이 관련 작업입니다 FixedUpdate. 비 연속적Physics.Raycast 이거나 한 번에 한 번만 전화를 걸 거나 Rigidbody.AddForce에 속해 있습니다 Update. 내가 언급 Rigidbody.AddForce한 것은 문서가 암시하는 것과 상반되는 것처럼 보이지만 핵심은 연속 대 비 연속입니다.

연속 물리학 만이 속하는 하나의 큰 이유 FixedUpdate는의 본질입니다 FixedUpdate. 다른 답변에서는 고정 interval, but that's slightly misleading. In reality, a script is passed a time in Time.deltaTime/ Time.fixedDeltaTime* 에서 FixedUpdate가 호출되는 방법에 대해 언급했습니다. 이는 호출 사이의 실제 시간과 직접적으로 일치하지 않고 호출 사이의 시뮬레이션 시간입니다.

(* Time.deltaTimeTime.fixedDeltaTime호출 같은 값은 FixedUpdate[유니티 말할 수있는 경우에 현재 통화 Time.deltaTime중에 유래 FixedUpdate및 반품 Time.fixedDeltaTime])

당연히 동일한 Update성능을 다양한 성능 때문에 일정한 방식으로 호출 할 수 없습니다 FixedUpdate. 중요한 차이점은 각 프레임 FixedUpdate이 호출 사이의 올바른 간격으로 평균을 내릴 정도로 자주 호출되지 않은 경우 여러 번 호출되거나 평균이 너무 높지 않다는 것입니다. 다음은 실행 순서 문서에서 프레임 단위로 FixedUpdate를 여러 번 호출 할 수 있다는 내용입니다.

... FixedUpdate : FixedUpdate는 종종 Update보다 더 자주 호출됩니다. 프레임 속도가 낮 으면 프레임 당 여러 번 호출 할 수 있으며 프레임 속도가 높으면 프레임간에 전혀 호출되지 않을 수 있습니다 ...

이것은 나머지 실행 순서와 엔진의 특성으로 인해 물리학에는 영향을 미치지 않지만 입력 한 다른 항목에 FixedUpdate영향을 미치므로 문제가 발생할 수 있습니다.

예를 들어 AI 처리를 내부에 배치 FixedUpdate하면 AI가 여러 프레임의 업데이트를 한 줄로 건너 뛰지 않는다고 가정 할 이유가 없습니다. 또한`FixedUpdate가 뒤 떨어질 때마다 물리 및 플레이어 입력 / 이동과 같은 것들이 처리되기 전에 AI가 단일 프레임에서 여러 번 업데이트됩니다. 버그와 불규칙한 행동을 추적합니다.

당신은 유니티 등을 제공하는 고정 간격을 사용하는 다른 방법에 무언가를해야하는 경우 CoroutinesInvokeRepeating.

그리고 Time.deltaTime언제 그리고 언제 사용할 것인지에 대한 작은 메모 :

Time.deltaTime의 효과를 설명하는 가장 쉬운 방법은 단위 프레임 당 단위 숫자를 변경하다 초당 . 예를 들어 transform.Translate(Vector3.up * 5)Update 와 같은 스크립트가있는 경우 기본적으로 프레임 당 5 미터의 속도로 변환을 이동합니다 . 즉, 프레임 속도가 낮 으면 움직임이 느리고 프레임 속도가 높으면 움직임이 빠릅니다.

동일한 코드를 가져 와서 변경 transform.Translate(Vector3.up * 5 * Time.deltaTime)하면 객체는 초당 5 미터의 속도로 이동 합니다. 즉, 프레임 속도에 관계없이 객체는 1 초마다 5 미터 씩 움직입니다 (그러나 프레임 속도가 느리면 X 초마다 같은 양으로 움직이기 때문에 객체의 움직임이 더 빨라집니다)

일반적으로 초당 움직임을 원합니다. 이렇게하면 컴퓨터 속도에 관계없이 물리 / 운동이 같은 방식으로 작동하며 느린 장치에서 이상한 버그가 발생하지 않습니다.

그리고 그것을 사용할 때 아무런 의미가 없습니다 FixedUpdate. 위에서 언급 한 것 때문에 각 호출마다 동일한 값 (Fixed Update Timestep 값)을 얻을 수 있으며 값에 아무런 영향을 미치지 않습니다. 에 정의 된 이동 / 물리 FixedUpdate가 이미 초당 단위로되어 있으므로 필요하지 않습니다.


4

Update기능은 모든 프레임에서 호출됩니다. 그 빈도는 컴퓨터가 이미지를 얼마나 빨리 렌더링 할 수 있는지에 달려 있습니다. 느린 컴퓨터에서는 Update빠른 컴퓨터 보다 덜 자주 호출됩니다. 시간 기반 계산을 수행 Time.deltaTime하는 경우 마지막 시간 Update이 호출 된 후 (캐비티 적용) 시간 이 얼마나되는지 알려주 는 정규화를 사용할 수 있습니다 .
일반적으로 Update디스플레이 관련 작업을 수행 하는 데 사용 합니다 (예 : UI 요소 업데이트).

FixedUpdate함수는 일정 간격으로 호출된다. 이미지 새로 고침 빈도에 상관없이 초당 시간 FixedUpdate이 호출 됩니다. 일반적으로 게임 플레이 관련 작업 (예 : 물리 업데이트)을 수행 하는 데 사용 됩니다1/Time.fixedDeltaTime
FixedUpdate


이것이 Time.delta 시간을 곱하는 것에 대한 대안입니까? 둘 중 하나를 사용해야 할 이유가 있습니까?
Ben

@ 그들은 두 가지 목표를 가지고 있으며 당신이하고있는 일에 올바른 기능을 사용해야합니다.
o0 '.

@Lohoris 죄송합니다. FixedUpdate를 통한 업데이트와 Time.deltaTime를 곱하여 프레임에 독립적으로 만드는 이유가 있습니까?
Ben

@Ben 예, 정밀도. 렌더링 속도가 느린 시스템에서는 Update호출 횟수가 줄어들고 시뮬레이션에 많은 어려움이 따릅니다. 시뮬레이션이 간단한 동안에는 눈치 채지 못할 수도 있지만 그렇지 않은 경우에는 쉽게 깨질 수 있습니다.
o0 '.

1
@Ben no : 시뮬레이션을 정확하게하려면 매번 무작위로 크거나 작은 것이 아닌 많은 작은 단계를 수행해야합니다. 그리고 아니요, FixedUpdate의 요점은 여러 번 호출되며 질문이 없다는 것입니다.
o0 '.

2

보낸 사람 : http://unity3d.com/learn/tutorials/modules/beginner/scripting/update-and-fixedupdate

FixedUpdate에 사용 된 시간 단계는 가변적이지 않습니다.

게임이 지연되기 시작하면 한 번의 업데이트에서 10 초 이상의 물리를 원하지 않으므로 일반적으로 고정 간격에서 호출되는 FixedUpdate에서 수행됩니다.

예를 들면 다음과 같습니다.

Update(float elapsedSeconds)
{
  Position += Velocity * 34.23423; //Windows Update is self-important
}
FixedUpdate(float elapsedSeconds)
{
  Position += Velocity * 0.0166; //60fps
}

어디:

Update(34.23423)

==

FixedUpdate(10.0)
FixedUpdate(10.0)
FixedUpdate(10.0)
//4.23423 + 5.76577 game-seconds later...
FixedUpdate(10.0)

나는 내 대답에서 이것을 언급했지만 FixedUpdate실제로 고정 간격으로 호출되지는 않습니다. 실제 특성은 FixedUpdate게임이 지연되기 시작하면 여러 사이클의 물리를 하나의 프레임으로 짜내고 너무 빠르면 사이클을 건너 뛰어 평균값이 고정 업데이트 시간 단계에 도달하는 것입니다. 유니티는 멀티 스레드 방식이 아니므로 고정 된 간격으로 FixedUpdate 호출을 보장 할 수있는 방법이 없습니다 (고정 업데이트 하나가 너무 오래 걸리는 경우). 그것이 가능하더라도 아마도 여전히 불가능할 것입니다.
Selali Adobor

대부분의 [Unity?] 사용자는 단일 콜백 메소드 내에서 Render / Update / FixedUpdate가 모두 호출된다는 것을 인식하지 못하므로 개념화했습니다. 노력해 주셔서 감사합니다!
Jon

2

Update최대한 빨리 호출됩니다. 'Time.deltaTime'변수는 마지막 호출 이후 경과 한 실제 시간으로 설정됩니다. 지연 또는 이와 유사한 것이 게임 속도를 늦추 Update더라도 지연이 끝나면 한 번만 호출됩니다 deltaTime.

FixedUpdate정기적으로 호출됩니다. 'Time.fixedDeltaTime'에 지정된 비율보다 더 자주 호출되지 않습니다. 지연 또는 이와 유사한 것이 게임 속도를 늦추는 FixedUpdate경우 게임을 따라 잡을 수 있도록 빠른 연속으로 여러 번 호출됩니다. 이전 Time.deltaTime과 동일하게 설정되어 있지만 두 코드간에 코드를 쉽게 마이그레이션 할 수 있도록하기위한 퍼지 일뿐입니다.Time.fixedDeltaTimeFixedUpdate

일반적으로 Update보간 가능한 동작과 FixedUpdate단계별로 계산해야하는 동작 또는 물리 기반 동작과 같은 동작에 따라 달라지는 동작에 사용해야합니다. Update줄을 따라 어떤 종류의 루프를 작성하는 경우 for(time=0;time<=deltaTime;time+=someStep)...FixedUpdate에서 대신 수행해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.