Version: 2022.2
언어: 한국어
ScriptableObject
중요 클래스 - Mathf

중요 클래스 - Time

Unity의 Time 클래스가 제공하는 중요한 기본 프로퍼티를 사용하여 프로젝트에서 시간과 관련된 값으로 작업할 수 있습니다.

이 페이지는 Time 클래스에 비교적 흔히 사용되는 몇몇 멤버에 대한 설명과 이 멤버들이 서로 어떤 관련이 있는지에 대한 설명을 포함하고 있습니다. Time 스크립트 레퍼런스 페이지에서 Time 클래스의 각 멤버에 대한 개별 설명을 읽을 수 있습니다.

Time 클래스에는 게임이나 앱이 실행되는 동안 시간의 흐름을 측정할 수 있도록 숫자 값을 제공하는 몇몇 프로퍼티가 있습니다. 예를 들면 다음과 같습니다.

  • Time.time은 프로젝트 재생 시작 후 경과한 시간 초 단위로 반환합니다.
  • Time.deltaTime은 마지막 프레임이 완료된 후 경과한 시간을 초 단위로 반환합니다. 이 값은 게임이나 앱이 실행될 때 초당 프레임(FPS) 속도에 따라 다릅니다.

Time 클래스는 또한 시간의 경과 방법을 제어하고 제한할 수 있는 프로퍼티도 제공합니다. 예를 들면 다음과 같습니다.

  • Time.timeScale은 시간이 경과하는 속도를 제어합니다. 이 값을 표시하거나, 설정하여 시간이 경과하는 속도를 제어하고 이를 통해 슬로우모션 효과를 생성할 수 있습니다.
  • Time.fixedDeltaTime은 Unity의 고정 타임스텝 루프 간격을 제어합니다(물리에 사용되며 결정론적 시간 기반 코드를 작성하려는 경우).
  • Time.maximumDeltaTime은 엔진이 위의 "delta time" 프로퍼티를 통과한 것으로 보고하는 시간의 양에 상한을 설정합니다.

변수 및 고정 타임스텝

Unity에는 시간을 추적하는 두 가지 시스템이 있습니다. 한 시스템은 각 스텝 사이 시간의 변수 양을 추적하고 다른 한 시스템은 각 스텝 사이 시간의 고정된 양을 추적합니다.

변수 타임 스텝 시스템은 화면에 프레임을 드로우하고 앱 코드나 게임 코드를 프레임 당 실행하는 반복된 프로세스로 작동합니다.

고정 타임 스텝 시스텝은 각 스텝마다 미리 정의한 양만큼 앞으로 나오며 시각적 프레임 업데이트와 연결되어 있지 않습니다. 이는 대개의 경우에는 물리 시스템과 연관되어 있으므로 고정 타임 스텝 크기가 지정한 속도로 실행되지만 필요한 경우 각 고정 타임 스텝마다 자체 코드를 실행할 수도 있습니다.

변수 프레임 속도 관리

각 프레임마다 코드를 표시하고 실행하는 데 걸리는 시간으로 인해 게임이나 앱의 프레임 속도는 다를 수 있습니다. 이는 실행하는 기기의 기능에 영향을 받으며 표시된 그래픽스의 복잡성 및 각 프레임마다 필요한 계산의 변화하는 양에도 영향을 받습니다. 예를 들어 화면상에 활성화된 캐릭터가 100개 있을 때는 캐릭터가 1개만 있을 때와 비교할 때 비교적 더 느린 프레임 속도로 게임이 실행될 수 있습니다. 이러한 변수 속도를 종종 "초당 프레임 속도" 또는 FPS라고 합니다.

품질 설정이나 어댑티브 퍼포먼스 패키지로 달리 제한되지 않는 한 Unity는 가능한 가장 빠른 프레임 속도로 게임이나 앱을 실행하려고 합니다. "Game Logic"으로 표시된 섹션의 실행 순서 다이어그램에서 각 프레임마다 일어나는 작업에 대해 더욱 자세한 내용을 확인할 수 있습니다.

Unity는 각 프레임에서 자체 코드를 실행할 수 있도록 Update 메서드를 엔트리 포인트로 제공합니다. 예를 들어 게임 캐릭터의 Update 메서드에서는 조이패드로 사용자 입력을 읽고 캐릭터를 일정량만큼 앞으로 이동할 수도 있습니다. 이처럼 시간 기반 동작을 처리하면 게임 프레임 속도가 달라질 수 있으므로 업데이트 호출 사이 시간의 길이도 달라질 수 있다는 점을 유념해야 합니다.

한번에 한 프레임씩 서서히 오브젝트를 전진시킨다고 할 때 처음에는 각 프레임마다 고정 거리만큼 오브젝트를 옮기면 될 것처럼 보입니다.

//C# script example
using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    public float distancePerFrame;
    
    void Update() {
        transform.Translate(0, 0, distancePerFrame); // this is incorrect
    }
}

하지만 이 코드로는 프레임 속도가 다르기 때문에 오브젝트의 속도도 확실히 다릅니다. 게임이 초당 100프레임으로 실행되면 오브젝트는 초당 100번 distancePerFrame 만큼 이동합니다. 그러나 프레임 속도가 초당 60프레임으로 느리면(가령 CPU 로드로 인한 경우) 초당 60번만 전진하고 따라서 동일한 시간 동안 더 짧은 거리를 이동합니다.

이는 대부분의 경우에도 마찬가지지만 게임과 애니메이션에서 특히 바람직하지 않습니다. 게임 내 오브젝트가 프레임 속도와는 관계없이 꾸준히 예측할 수 있는 속도로 이동하기를 원하는 것이 훨씬 더 일반적입니다. 이에 대한 솔루션은 각 프레임마다 경과된 시간의 양으로 각 프레임마다 움직이는 양을 확대/축소하는 것입니다. 이 부분에 대해서는 Time.deltaTime 프로퍼티에서 읽을 수 있습니다.

//C# script example
using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    public float distancePerSecond;
    
    void Update() {
        transform.Translate(0, 0, distancePerSecond * Time.deltaTime);
    }
}

이제 이동 거리가 distancePerFrame 이 아닌 distancePerSecond 로 주어진다는 점에 유의해야 합니다. 프레임 속도가 달라짐에 따라 이동 단계의 크기 역시 맞추어 달라지게 되며 따라서 이 오브젝트의 속력이 일정해집니다.

타겟 플랫폼에 따라 Application.targetFrameRate 또는 QualitySettings.vSyncCount를 사용하여 애플리케이션의 프레임 속도를 설정하십시오. 자세한 내용은 Application.targetFrameRate API 문서를 참조하십시오.

고정 타임스텝

메인 프레임 업데이트와는 달리 Unity의 물리 시스템은 고정 타임 스텝에 따라 작동합니다. 이는 시뮬레이션의 정확도와 일관성을 위해 중요합니다. 각 프레임 시작 시 Unity는 현재 시간을 따라잡는 데 필요한 만큼의 고정된 업데이트를 수행합니다. "Physics"로 표시된 섹션의 실행 순서 다이어그램에서 고정된 업데이트 주기 동안 일어나는 작업에 대해 더욱 자세한 내용을 확인할 수 있습니다.

필요한 경우 고정 타임 스텝과 동기화하여 자체 코드를 실행할 수도 있습니다. 이는 리지드바디힘을 적용하는 것처럼 자체 물리 관련 코드를 실행하는 데 가장 흔히 사용됩니다. Unity는 각 고정 타임 스텝마다 자체 코드를 실행하기 위해 FixedUpdate 메서드를 엔트리 포인트로 제공합니다.

fixedDeltaTime 프로퍼티는 Unity의 고정 타임 스텝 루프 간격을 제어하고 초 단위로 지정됩니다. 예를 들어 값이 0.01이면 각 고정 타임 스텝은 기간이 100분의 1초이므로 초당 100개의 고정 타임 스텝이 있습니다.

게임이나 앱이 초당 고정 타임 스텝 수보다 더 높은 프레임 속도로 실행되고 있다면 이는 각 프레임 기간이 단일 고정 타임 스텝 기간보다 더 짧다는 의미입니다. 그런 경우 Unity는 프레임 당 0회 또는 1회의 고정된 물리 업데이트를 수행합니다. 예를 들어 고정 타임 스텝 값이 0.02이면 초당 고정 업데이트가 50회 수행됩니다. 게임이나 앱이 초당 60 프레임으로 실행되면 약 10개 프레임 중 1개 프레임 꼴로 고정된 업데이트가 발생하지 않습니다.

60 FPS로 실행 중인 업데이트와 초당 50회로 업데이트를 실행하는 FixedUpdate를 보여주는 예. 경우에 따라 해당 FixedUpdate가 없이 발생하는 프레임 업데이트(노란색 표시)
60 FPS로 실행 중인 업데이트와 초당 50회로 업데이트를 실행하는 FixedUpdate를 보여주는 예. 경우에 따라 해당 FixedUpdate가 없이 발생하는 프레임 업데이트(노란색 표시)

게임이나 앱이 고정된 타임 스텝 값보다 낮은 프레임 속도로 실행되면 각 프레임의 시간이 고정된 타임 스텝 1개의 시간보다 길다는 뜻입니다. Unity는 이를 처리하기 위해 물리 시뮬레이션이 마지막 프레임 이후 경과된 시간을 따라잡을 수 있도록 프레임당 1회 이상의 고정된 업데이트를 수행합니다. 예를 들어, 고정된 타임 스텝 값이 0.01이면 초당 100회의 고정된 업데이트가 발생합니다. 앱이 초당 25프레임 가량의 속도로 실행되면 Unity는 프레임마다 4회의 고정된 업데이트를 수행합니다. 이렇게 프레임 속도가 높은 것보다 비교적 더 정확한 물리를 모델링하는 것이 더 중요한 시나리오를 원할 수도 있습니다.

25 FPS로 실행 중인 업데이트와 초당 100회로 업데이트를 실행하는 FixedUpdate를 보여주는 예. 한 프레임 동안 FixedUpdate가 4회 발생(노란색으로 표시)
25 FPS로 실행 중인 업데이트와 초당 100회로 업데이트를 실행하는 FixedUpdate를 보여주는 예. 한 프레임 동안 FixedUpdate가 4회 발생(노란색으로 표시)

Time 창이나 Time.fixedDeltaTime 프로퍼티를 사용한 스크립트에서 고정된 타임 스텝 기간을 읽거나 변경할 수 있습니다.

참고: 타임 스텝 값이 작으면 물리 업데이트가 더 자주 일어나며 시뮬레이션도 더 정확하다는 의미이며 이로 인해 CPU 로드가 더 높아집니다.

Unity의 시간 로직

다음 흐름도는 Unity가 프레임 1개에서 시간을 세는 데 사용하는 로직을 보여주며, time, deltaTime, fixedDeltaTimemaximumDeltaTime 프로퍼티의 상호 관계도 나타냅니다.

시간 관련 배리에이션 조절 및 처리

위에서 설명한 바와 같이 각 프레임 사이에 경과한 시간의 양에 배리에이션이 있을 수 있습니다.

경과된 시간의 배리에이션은 미미할 수 있습니다. 예를 들어 초당 60프레임으로 실행되는 게임에서 실제 초당 프레임 수는 조금 다를 수 있으므로 각 프레임은 0.016초와 0.018초 사이에 지속됩니다. 앱이 과중한 계산이나 가비지 컬렉션을 수행하거나 프레임 속도를 유지하는 데 필요한 리소스가 다른 앱에서 사용되는 경우 배리에이션이 더 커질 수 있습니다.

이 섹션에서 설명한 프로퍼티는 다음과 같습니다.

이러한 프로퍼티는 각각 자체 스크립팅 API 문서 페이지가 있지만 적절한 사용법을 이해하려면 서로에 관한 설명과 출력을 확인하는 것이 도움이 될 수 있습니다.

Time.time은 플레이어가 시작한 이후 경과한 시간의 양을 가리키며 일반적으로 꾸준히 계속해서 증가합니다. Time.deltaTime은 지난 프레임 이후 경과한 시간의 양을 가리키므로 이상적으로는 꽤 일정하게 유지됩니다.

이러한 값은 모두 앱이나 게임 내에서 경과한 시간을 주관적으로 측정한 값입니다. 즉 적용된 시간의 스케일을 고려한다는 의미입니다. 따라서 예를 들어 슬로우모션 효과(보통의 재생 속도의 10%를 가리킴)에 대해 Time.timeScale을 0.1로 설정할 수 있습니다. 이런 상황에서 Time.time에서 보고한 값은 “실제” 시간의 10% 속도로 증가합니다. 10초 뒤 Time.time 값은 1초 증가합니다. 앱에서 속도를 늦추거나 올리는 것 외에도 Time.timeScale을 0으로 설정하여 게임을 일시정지할 수 있습니다. 이런 경우 Update 메서드는 여전히 호출되어 있지만 Time.time은 전혀 증가하지 않으며 Time.deltaTime은 0입니다.

이러한 값은 또한 Time.maximumDeltaTime 프로퍼티 값으로 고정될 수도 있습니다. 즉 일시정지 길이나 이러한 프로퍼티가 보고한 프레임 속도의 배리에이션은 절대 maximumDeltaTime을 초과하지 않습니다. 예를 들어 지연은 1초 발생하지만 maximumDeltaTime은 기본 값이 0.333으로 설정되어 있다면 실제 월드에서는 실제로 시간이 더 많이 경과했지만 Time.time은 0.333만큼만 증가하고 Time.deltaTime도 0.333으로 같습니다.

이러한 각 프로퍼티 (Time.unscaledTimeTime.unscaledDeltaTime)의 스케일되지 않은 버전은 이런 주관적인 배리에이션과 제한을 무시하고 두 경우에서 경과한 실제 시간을 보고합니다. 게임이 슬로우모션으로 플레이될 때 균일하게 고정된 속도로 응답해야 하는 경우에 유용합니다. 여기에 해당하는 예는 UI 인터랙션 애니메이션을 들 수 있습니다.

아래의 표는 단일 프레임에서 중간에 하나의 큰 지연이 발생하며 16개의 프레임이 차례로 경과하는 예시를 보여줍니다. 이러한 그림은 여러 Time 클래스 프로퍼티가 보고하고 프레임 속도로 이런 큰 배리에이션에 응답하는 방법을 보여줍니다.

프레임 unscaledTime 시간 unscaledDeltaTime deltaTime smoothDeltaTime
1 0.000 0.000 0.018 0.018 0.018
2 0.018 0.018 0.018 0.018 0.018
3 0.036 0.036 0.018 0.018 0.018
4 0.054 0.054 0.018 0.018 0.018
5 0.071 0.071 0.017 0.017 0.018
6 0.089 0.089 0.018 0.018 0.018
7 0.107 0.107 0.018 0.018 0.018
8 (a) 1.123 (b) 0.440 (c) 1.016 (d) 0.333 (e) 0.081 (f)
9 1.140 0.457 0.017 0.017 0.066
10 1.157 0.474 0.017 0.017 0.056
11 1.175 0.492 0.018 0.018 0.049
12 1.193 0.510 0.018 0.018 0.042
13 1.211 0.528 0.018 0.018 0.038
14 1.229 0.546 0.018 0.018 0.034
15 1.247 0.564 0.018 0.018 0.031
16 1.265 0.582 0.018 0.018 0.028

1에서 7까지 프레임은 대략 초당 60프레임인 꾸준한 속도로 실행 중입니다. 두 “시간”과 “unscaledTime”은 꾸준히 함께 증가하며 이 예시에서는 timeScale이 1로 설정되어 있음을 가리킵니다.

그런 다음 프레임 8(a)에서는 1초가 지난 직후 큰 지연이 발생합니다. 이런 일은 리소스 경쟁이 있을 때 발생할 수 있습니다. 예를 들어 앱의 한 코드가 디스크에서 대량의 데이터를 로드하는 동안 메인 프로세스를 막는 경우입니다.

maximumDeltaTime 값보다 큰 프레임 지연이 발생하면 Unity는 deltaTime이 보고한 값과 현재 time에 추가된 양을 제한합니다. 이 제한의 목적은 타임 스텝이 시간의 해당 양을 초과한 경우 발생할 수 있는 원치 않는 부작용을 방지하기 위함입니다. 제한이 없다면 이론적으로 한 프레임에서 다음 프레임으로 오브젝트가 이동할 수 있는 거리에 제한이 없기 때문에 움직임이 deltaTime으로 크기가 지정된 오브젝트는 프레임 속도 스파이크 동안 벽을 통해 "글리치"할 수 있으므로 전혀 교차하지 않고도 단일 프레임에서 장애물의 한쪽에서 다른 쪽으로 점프할 수 있습니다.

Maximum allowed timestep이라고 레이블이 지정된 Time 창에서 Time.maximumDeltaTime 프로퍼티로 maximumDeltaTime 값을 조정할 수 있습니다.

기본 maximumDeltaTime 값은 1/3초(0.3333333)입니다. 즉 이동을 deltaTime이 제어하는 게임에서는 이전 프레임 이후로 실제 경과한 시간의 양에 관계없이 한 프레임에서 다음 프레임으로의 오브젝트 이동이 1/3초 안에 다룰 수 있는 거리로 제한됩니다.

위의 표에 나온 데이터를 그래프 형식으로 보면 이러한 시간 프로퍼티가 서로에 관해 동작하는 방식을 시각화하는 데 도움이 될 수 있습니다.

위의 프레임 8에서 unscaledDeltaTime (d)와 deltaTime (e)가 경과한 것으로 보고한 시간의 양이 다르다는 사실을 확인할 수 있습니다. 프레임 7과 프레임 8 사이 경과한 실제 시간은 온전한 1초이지만 deltaTime은 0.333초만 경과한 것으로 보고합니다. 이는 deltaTime이 maximumDeltaTime 값에 고정되어 있기 때문입니다.

유사하게 unscaledTime (b)은 참 값(고정되지 않은 값)이 추가되었으므로 거의 1초가 증가했지만 반면에 time (c)는 더 작은 고정 값만큼만 증가했습니다. time 값은 경과한 시간의 실제 양을 따라잡지 않고 그 대신 마치 지연이 maximumDeltaTime만큼의 길이였던 것처럼 동작합니다.

Time.smoothDeltaTime 프로퍼티는 알고리즘에 따라 모든 배리에이션이 평활화된 최근 deltaTime 값의 근사치를 보고합니다. 이는 동작이나 다른 시간 기반 계산에서 원치 않은 큰 스텝 또는 변동을 예방하는 또 다른 기술입니다. 특히 maximumDeltaTime으로 설정된 임계값 아래로 내려가는 경우 사용됩니다. 평활화 알고리즘은 나중의 배리에이션은 예측할 수 없지만 보고된 값을 점점 더 채택하여 최근 경과한 델타 시간 값에서 배리에이션을 평활화하므로 보고된 평균 시간은 실제 경과한 시간의 양과 거의 동일하게 유지됩니다.

시간 배리에이션과 물리 시스템

maximumDeltaTime 값은 또한 물리 시스템에도 영향을 미칩니다. 물리 시스템은 fixedTimestep 값을 사용하여 각 스텝에서 시뮬레이션하는 시간의 양을 결정합니다. Unity는 경과한 시간의 양과 함께 물리 시뮬레이션을 최신으로 유지하려고 하며 위에서 언급한 대로 간혹 프레임당 여러 물리 업데이트를 수행합니다. 하지만 물리 시뮬레이션이 너무 동떨어지는 경우(예: 조금 과한 계산 또는 일종의 지연으로 인함) 물리 시스템은 현재 시간을 따라잡기 위해 대량의 스텝을 요구할 수 있습니다. 이 대량의 스텝은 그 자체로 속도를 더 느리게 할 수 있습니다.

따라잡으려는 시도로 인해 속도가 느려지는 이러한 주기적인 피드백을 예방하기 위해 maximumDeltaTime 값은 물리 시스템이 특정 두 개의 프레임 사이에서 시뮬레이션하는 시간의 양에 대해 제한하는 역할도 합니다.

프레임 업데이트 처리에 소요되는 시간이 maximumDeltaTime보다 긴 경우 물리 엔진은 maximumDeltaTime을 넘어서는 시간을 시뮬레이션하려고 하지 않고 대신 프레임 프로세싱이 시간을 따라잡을 수 있도록 합니다. 프레임 업데이트가 완료되면 물리는 시간을 정지한 이후 시간이 경과하지 않은 것처럼 재개됩니다. 결과적으로 물리 오브젝트는 일반적인 경우처럼 완벽하게 실시간으로 움직이지 않으며 약간 느려집니다. 그러나 물리 “시계”는 계속해서 물리 오브젝트를 정상적으로 움직인 것처럼 추적합니다. 물리 시간의 지연은 보통 알아차릴 수 없으며 게임플레이 성능과 맞바꾸더라도 무리가 없는 사항입니다.

시간 스케일

슬로우모션과 같은 특수 시간 효과를 만들기 위해서는 게임 시간의 흐름을 늦추어 코드의 애니메이션과 시간 기반 계산을 더 느린 속도로 일어나도록 하는 편이 유용할 때가 있습니다. 그뿐만 아니라 때로는 게임이 일시정지했을 때처럼 게임 시간을 완전히 멈추고자 할 때도 있습니다. Unity에서는 Time Scale 프로퍼티를 통해 게임 시간이 현실 시간에 대비하여 흘러가는 속도를 조절할 수 있습니다. 이 스케일이 1.0으로 설정되어 있으면 게임 시간은 현실 시간과 동일합니다. 값이 2.0이 되면 Unity에서는 시간이 두 배 빨리 흘러갑니다(즉, 액션 스피드가 올라갑니다). 반면에 값이 0.5면 게임 플레이 속도가 절반으로 줄어듭니다. 값이 0이면 게임 내 시간이 완전히 “멈추게” 됩니다. 시간 스케일은 실제로 느리게 실행되도록 만드는 것이 아니라 Time.deltaTimeTime.fixedDeltaTime을 통해 Update 및 FixedUpdate 함수에 전해지는 타임 스텝만을 변경한다는 점에 유의해야 합니다. Update 함수는 시간 스케일이 줄어든 만큼 더 자주 호출되게 되지만 각 프레임마다 전해지는 deltaTime 값은 줄어듭니다. 다른 스크립트 함수는 시간 스케일의 영향을 받지 않으므로 예를 들어, 게임이 일시정지 상태일 때 일반 상호작용을 하는 GUI를 표시할 수 있습니다.

Time 창에는 시간 스케일을 전역으로 설정할 수 있도록 해 주는 프로퍼티가 있지만 Unity의 ScriptRef:Time-timeScale 프로퍼티를 사용하여 스크립트에서 값을 설정하는 편이 일반적으로 보다 더 유용합니다.

//C# script example
using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    void Pause() {
        Time.timeScale = 0;
    }
    
    void Resume() {
        Time.timeScale = 1;
    }
}

프레임 속도 캡처

게임플레이를 동영상으로 녹화하는 것은 시간 관리에 있어 특수한 경우에 해당합니다. 화면 이미지를 저장하는 작업은 상당한 시간이 걸리기 때문에 게임의 일반 프레임 속도가 줄어들고 동영상은 게임의 실제 성능을 반영하지 못합니다.

동영상의 형상을 개선하려면 Capture Framerate 프로퍼티를 사용합니다. 프로퍼티 기본 값은 기록되지 않은 게임 플레이에 대해 0입니다. 프로퍼티 값을 0이 아닌 값으로 설정하면 게임 시간이 느려지고, 프레임 업데이트는 정확히 규칙적인 간격으로 일어납니다. 프레임 간의 시간 간격은 1 / Time.captureFramerate와 같기 때문에 값이 5.0으로 설정되면 업데이트는 매 1/5초마다 발생합니다. 프레임 속도 요청이 실질적으로 감소하기 때문에 Update 함수가 스크린샷을 저장하거나 다른 동작을 수행할 시간이 확보됩니다.

//C# script example
using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    // Capture frames as a screenshot sequence. Images are
    // stored as PNG files in a folder - these can be combined into
    // a movie using image utility software (eg, QuickTime Pro).
    // The folder to contain our screenshots.
    // If the folder exists we will append numbers to create an empty folder.
    string folder = "ScreenshotFolder";
    int frameRate = 25;
        
    void Start () {
        // Set the playback frame rate (real time will not relate to game time after this).
        Time.captureFramerate = frameRate;
        
        // Create the folder
        System.IO.Directory.CreateDirectory(folder);
    }
    
    void Update () {
        // Append filename to folder name (format is '0005 shot.png"')
        string name = string.Format("{0}/{1:D04} shot.png", folder, Time.frameCount );
        
        // Capture the screenshot to the specified file.
        Application.CaptureScreenshot(name);
    }
}

이 기술을 사용하면 동영상을 개선하지만 게임은 플레이하기에 훨씬 더 어려워질 수 있습니다. Time.captureFramerate의 여러 값을 시도하여 적절한 균형점을 찾습니다.

ScriptableObject
중요 클래스 - Mathf