23.03.14.(화) - 시간

김도익·2023년 3월 14일
0

Unity

목록 보기
10/23

<교수님 말씀>

  • 모바일에서는 프레임 수를 제한을 둡니다. 무제한으로 열어두면 CPU가 계속 작동하게 되서 휴대폰이 뜨거워지게 됩니다.

  • 사람이 영상처럼 느끼는 프레임은 24프레임입니다.
    게임은 최소 30프레임 ~ 최대 144프레임 이상으로 갑니다.

  • un접두사가 붙은 것들은 실제 시간.

    0이면 게임 세상은 멈추고
    1이면 현재 시간에 맞게 흘러가고
    1.2면 현재 시간보다 1.2배 빠르게 흘러갑니다.
    단, 게임안에 있는 모든 오브젝트에게 적용됩니다.

혹여 한 캐릭터만 빠르게 만들고 싶다면, 느리게 만들고 싶다면 해당 게임오브젝트에만 곱셈을 해주면 됩니다.

개요

어떤 환경에서 내 애플리케이션을 실행하던지 똑같이 보이려면 로직에 시간이 들어가야합니다. 이번 시간에는 가상 월드에서 시간을 다루는 법에 대해서 배워보도록하겠습니다.

델타타임

Time.deltaTime은 프레임 사이에 시간을 뜻한다.
게임에서 한 화면을 프레임(Frame)이라고 하며, 초당 몇 프레임을 그리는 지를 나타내는 값을 FPS(Frame Per Second)라고 합니다.

FPS는 컴퓨터의 사양에 따라 같은 애플리케이션을 실행한다 할지라도 달라지기 때문에 FPS에 기반한 구현을 옳지 않습니다.

  • z방향으로 이동하는 물체를 구현할 때 아래와 같이 구현하면 안됩니다.

  • FPS와 무관하게 콘텐츠를 구현하려면 시간의 개념이 들어가야합니다.
    그래서 게임에서는 프레임 사이에 흘러간 시간을 기록하며 이를 델타타임(Delta Time)이라고 합니다. Unity에서는 Time.deltaTime을 사용합니다.

Unity의 델타타임

Unity는 2가지의 델타타임을 갖고 있습니다.

가변 델타타임

가변 델타타임은 Time.deltaTime에 저장되며, 사용되는 부분은 Game Logic입니다. Unity는 가능한 가장 빠른 프레임 속도로 게임을 실행하려 하며, 만약 타겟 플랫폼에 따라 프레임 속도를 조절하고 싶다면 여기를 참고하면 되겠습니다.

  • 가변 델타타임은 아래 장소에서 일어나야합니다.
    고정 델타타임이 아래 장소에서 일어나면, 에러가 발생합니다.

고정 델타타임

Time.fixedDeltaTime은 CPU 물리연산에 영향을 미치지 않는다.
고정 델타타임은 물리 연산을 위해 사용됩니다. 물리의 경우 어떤 하드웨어 환경이던지 동일한 결과를 보장해야 합니다.

만약 가변 델타타임을 이용한다면 고성능의 컴퓨터에서는 더 촘촘히 물리가 연산되겠지만, 저성능의 컴퓨터에서는 듬성듬성 물리가 계산되어 두 컴퓨터에서의 결과가 동일하지 않을 수 있습니다.

고정 델타타임은 Time.fixedDeltaTime에 저장되며, 사용되는 부분은 Physics입니다.

  • Physics가 아닌 곳에서 사용하면 안됩니다.
    고정 델타타임은 Physic에서만 작동하게 만들어야합니다.

고정 델타타임을 사용하는 FixedUpdate()의 경우 Update()와는 다른 동작을 하게 되는데, 프레임 사이에 꽤 많은 시간이 흐른 경우 Unity는 이를 따라잡기 위해 다수의 FixedUpdate() 호출을 일으킬 수 있습니다. 가령 초당 25 프레임 속도를 가지는 게임이 있다고 할 때, 고정 델타타임을 0.01로 조정했다면 아래와 같이 타임라인을 그려볼 수 있습니다.

시간 로직

아래의 그림은 Unity의 시간 처리 플로우 차트입니다.

자세한 설명은 여기에서 참고하면 되겠습니다.

Update와 FixedUpdate

Update는 1프레임당 1번 실행됩니다.
하드웨어 성능에 따라 1초당 업데이트가 되는 속도는 상이합니다.
(통상 100 ~ 140 정도)

FixedUpdate는 1초당 50프레임이 되도록 Unity가 설정을 해놓았습니다.
FixedUpdate는 더 세세하게 물리 연산이 일어납니다.

Update와 FixedUpdate는 서로 다른 시간대로 돌아갑니다.

물리연산은 움직이는 애들(총알, 미사일 등)을 생각하면 편합니다.

물리연산은 한 번에 업데이트가 안되고, 여러번 촘촘히 나눠서 물리연산이 이뤄집니다.

쉽게 말하면 Update와 FixedUpdate가 호출되는 횟수가 다릅니다.
물리연산(FixedUpdate)은 한 프레임에 여러 번 호출 될 수 있습니다.

추가 공부

  • 1초마다 흘러간 시간을 표시하는 로직

  • 10시간에서 랜덤한 시간을 빼고 점점 줄어드는 시간을 표시하는 로직
    (예를 들어 게임 보상 받는 시간을 표시한 로직이라고 볼 수 있음)

  • 머리로만 생각하지말고 일단 작성하자.
    작성하고, 디버그 돌려서 어떻게 나오는지 눈으로 확인하고, 필요한 부분 찾아서 수정하자.

  • 분할 접근으로 다가가야한다.
    한번에 생각할려고 하니 어렵고 안되는 것이다.

profile
고급 개발자가 되고 싶어요!

0개의 댓글