프레임
"프레임"이라는 용어는 그래픽 렌더링과 관련된 컴퓨터 그래픽스의 기본적인 단위로서 중요한 개념이다. 간단하게 말해서, 게임 또는 어떤 동영상 콘텐츠에서 프레임은 연속적인 순간 순간의 정적인 이미지이다. 이러한 프레임들이 빠르게 연속적으로 화면에 표시될 때 우리의 눈은 이를 연속적인 움직임으로 인식하게 된다.
움직임을 가진 요소들이 프레임에 영향을 받는 이유:
1. 움직임의 일관성: 게임 내의 움직임은 프레임율에 독립적으로 일관되게 보이게 만들기 위해 `Time.deltaTime`과 같은 값을 사용한다. 예를 들어, 게임 캐릭터가 초당 5 유닛 움직여야 한다면, 이 움직임은 30fps에서도 60fps에서도 동일하게 보여야 한다.
2. 프레임 드롭과 렉: 만약 게임이 너무 많은 연산을 처리해야 하거나 최적화가 제대로 되지 않았다면, 프레임 드롭이 발생할 수 있다. 이 경우 움직임이 끊기거나 부자연스러워질 수 있다.
3. 물리 시뮬레이션: 일부 게임 엔진에서는 물리 시뮬레이션을 프레임율과 독립적으로 업데이트한다. 이는 `FixedUpdate()`와 같은 별도의 루프에서 처리되며, 이를 통해 물리 시뮬레이션의 정확성과 안정성을 유지한다.
결국, 움직임을 가진 요소들이 프레임에 영향을 받는 이유는 움직임을 구성하는 기본 단위가 프레임이기 때문이다. 프레임을 통해 연속적인 움직임을 생성하고 제어하며, 이를 통해 사용자에게 부드러운 게임 플레이 경험을 제공한다.
Unity에서 "프레임"과 관련된 핵심 요소들
1. 프레임 (Frame):
- 게임에서 프레임은 게임이 화면을 새로 그리는 한 번의 사이클을 의미한다.
- FPS (Frames Per Second)는 게임이 초당 얼마나 많은 프레임을 렌더링하는지를 나타낸다.
2. `Update()`:
- `Update()`는 매 프레임마다 호출됩니다. 프레임 속도가 변동적이기 때문에 `Update()` 호출 간격은 일정하지 않을 수 있다.
- 일반적인 게임 로직, 입력 처리, 움직임 등을 처리하기 위해 사용된다.
3. `FixedUpdate()`:
- `FixedUpdate()`는 고정된 시간 간격마다 호출된다. 주로 물리 시뮬레이션과 관련된 처리를 위해 사용된다.
- `Time.fixedDeltaTime`은 `FixedUpdate()` 사이의 고정된 시간 간격을 설정하거나 조회하는 데 사용된다. 기본적으로 이 값은 0.02초 (즉, 50FPS)로 설정되어 있다.
- `Time.timeScale`에 영향을 받는다.
4. `Time.timeScale`과의 관계:
- `Time.timeScale`은 게임의 전체 시간 흐름의 스케일을 설정한다. `Update()`와 `FixedUpdate()`의 호출 빈도에 모두 영향을 준다.
- `Time.timeScale`이 0이면 `FixedUpdate()`는 호출되지 않지만, `Update()`는 계속해서 호출된다.
5. `Time.unscaledDeltaTime`과의 관계:
- `Time.deltaTime`은 `Time.timeScale`에 영향을 받는 반면, `Time.unscaledDeltaTime`은 `Time.timeScale`의 영향을 받지 않는다.
- `Time.unscaledDeltaTime`는 `timeScale`이 변경되더라도 변하지 않는 실제 프레임 간의 시간 간격을 반환한다. 이는 `timeScale`을 수정했을 때도 일정한 로직을 유지하고 싶을 때 유용하다.
Unity의 프레임 관련 기능들은 게임의 타이밍과 로직의 정밀한 제어를 가능하게 한다. `Update()`는 일반적인 게임 로직에, `FixedUpdate()`는 물리 시뮬레이션에 주로 사용되며, `timeScale`과 `deltaTime`을 통해 게임 내의 시간 흐름을 제어할 수 있다.
Time 관련 속성들
Unity 엔진에서 시간 관련한 특성들을 조작하거나 조회하는 데 사용되는 핵심 개념 및 속성들
1. `Time.timeScale`:
- `Time.timeScale`은 게임의 전체적인 시간 흐름의 스케일을 설정한다.
- 기본값은 1입니다. 이것은 정상 속도이다.
- `Time.timeScale`을 0.5로 설정하면 게임이 절반의 속도로 실행된다. 2로 설정하면 2배 빠른 속도로 게임이 실행된다.
- `Time.timeScale`을 0으로 설정하면 게임 내의 모든 움직임이 일시 중지된다. 이것은 일시 정지 메뉴를 구현하는 데 유용할 수 있다.
2. `Time.deltaTime`:
- `Time.deltaTime`은 마지막 프레임과 현재 프레임 사이의 시간(초)을 나타낸다.
- 이 값은 일반적으로 게임 내의 움직임을 프레임 속도에 독립적으로 만들기 위해 사용된다. 예를 들어, 오브젝트를 초당 5 유닛 만큼 움직이게 하려면 `transform.position += movementDirection * 5 * Time.deltaTime;`와 같은 코드를 사용할 수 있다.
- `Time.deltaTime` 값은 `Time.timeScale`에 영향을 받는다. 즉, `timeScale`을 변경하면 `deltaTime` 값도 그에 따라 변경된다.
3. `Time.unscaledDeltaTime`:
- `Time.unscaledDeltaTime`은 `timeScale`의 영향을 받지 않는 `deltaTime` 값이다.
- 이것은 `timeScale`을 변경했을 때에도 일정한 시간 간격을 알고 싶을 때 유용하다. 예를 들어, 게임이 일시 정지되어 있거나 느린 모션 효과 중에도 일정한 속도로 UI 애니메이션을 진행하고 싶을 때 사용할 수 있다.
Unity의 프레임 관련 개념과, 코루틴, `timeScale`
1. 프레임과 Unity의 메인 루프:
- Unity의 메인 루프는 프레임별로 실행된다. 각 프레임은 일련의 단계로 구성되어 있으며, 그 중에는 사용자의 코드를 실행하는 단계도 포함된다(`Update()`, `FixedUpdate()`, 렌더링 등).
2. `Update()` vs `FixedUpdate()`:
- `Update()`: 매 프레임마다 호출되는 함수. 프레임율에 따라 호출 빈도가 달라지므로 주로 그래픽 또는 입력과 같은 비물리적인 처리에 사용된다.
- `FixedUpdate()`: 고정된 간격으로 호출되는 함수. 주로 물리 시뮬레이션에 사용된다.
3. `Time.timeScale`:
- `Time.timeScale`은 Unity의 전체 시간 흐름의 스케일을 조절한다.
- `timeScale`이 0이면 게임의 시간은 멈추게 되며, 이것은 일시 정지 기능을 구현할 때 유용하다.
- `timeScale`이 0일 때, `Update()`는 계속 호출되지만 `FixedUpdate()`는 호출되지 않다.
4. 코루틴 (Coroutines) :
- 코루틴은 Unity에서 비동기 작업을 수행하는 데 사용되는 기능이다.
- `yield return new WaitForSeconds(seconds)`를 사용하여 코루틴의 실행을 일정 시간 동안 지연시킬 수 있다. 이 때, 지연시간은 `timeScale`에 영향을 받는다.
- 만약 `timeScale`에 영향을 받지 않는 대기를 원한다면, `yield return new WaitForSecondsRealtime(seconds)`를 사용할 수 있다.
5. 코루틴과 프레임:
- `yield return null`: 코루틴의 실행을 다음 `Update()` 호출까지 지연시킨다.
- `yield return new WaitForFixedUpdate()`: 코루틴의 실행을 다음 `FixedUpdate()` 호출까지 지연시킨다.
'👾 내일배움캠프 > 🎮 TIL & WIL' 카테고리의 다른 글
내일배움캠프 32일차 TIL - UI요소 스크립트로 생성하기 (1) | 2023.09.22 |
---|---|
내일배움캠프 32일차 TIL - 애니메이션 UI에 적용 (0) | 2023.09.21 |
내일배움캠프 30일차 TIL - 스크립트 분리 (0) | 2023.09.21 |
내일배움캠프 6주차 WIL - 팀 프로젝트 회고 (0) | 2023.09.21 |
내일배움캠프 29일차 TIL - GameManager (0) | 2023.09.21 |