AnyPortrait > 메뉴얼 > 스크립트로 업데이트 시간 제어하기
게임에는 다양한 연출 기법이 사용되는데, 대표적인 기법은 재생 속도를 조절하는 것입니다.
게임 전체의 속도를 빠르게 또는 느리게 만들면서 긴장감있는 플레이를 제공하기도 하고, 특정 캐릭터의 애니메이션 속도만 제어하여 재미있는 효과를 보여줄 수도 있습니다.
기본적으로 유니티의 Time 클래스를 이용하여 게임의 속도를 조절 할 수 있습니다.
여기에 덧붙여서 AnyPortrait의 캐릭터의 애니메이션 재생 속도를 스크립트로 제어할 수 있습니다.
이 페이지에서는 애니메이션 재생 속도를 제어하는 스크립트의 예시를 소개합니다.
스크립트 함수에 대한 설명은 관련 페이지에서도 볼 수 있습니다.
스크립트의 예시를 보여주기 위해서 위와 같이 4개의 동일한 캐릭터를 배치했습니다.
아래의 스크립트 예시의 결과는 페이지 하단의 동영상에서 볼 수 있습니다.
void Update()
{
// Q키를 누르면 게임의 속도가 기본값(1)으로 돌아옵니다.
if (Input.GetKeyDown(KeyCode.Q))
{
Time.timeScale = 1.0f;
}
// W키를 누르면 게임의 속도가 3배로 빨라집니다.
if (Input.GetKeyDown(KeyCode.W))
{
Time.timeScale = 3.0f;
}
}
Time.deltaTime을 이용하는 모든 객체들은 게임 배속의 영향을 받습니다.
AnyPortrait로 제작된 캐릭터도 기본적으로 게임 배속의 영향을 받습니다.
아래의 영상의 모든 경우는 각각 전체 게임의 배속이 1배와 3배일 때를 비교해서 보여줍니다.
void Update()
{
// (생략)
// A키를 누르면 배속 옵션을 모두 초기화합니다.
if (Input.GetKeyDown(KeyCode.A))
{
portraitA.SetUpdateTimeMethod(false);
portraitB.SetUpdateTimeMethod(false);
portraitC.SetUpdateTimeMethod(false);
portraitD.SetUpdateTimeMethod(false);
}
// S키를 누르면 배속 비율을 각각 지정합니다.
if (Input.GetKeyDown(KeyCode.S))
{
portraitA.SetUpdateTimeMethod(false);
portraitB.SetUpdateTimeMethod(false, 1.5f);
portraitC.SetUpdateTimeMethod(true);
portraitD.SetUpdateTimeMethod(true, 1.5f);
}
}
SetUpdateTimeMethod(bool useUnscaleDeltaTime, float multiplier) 함수는 게임 전체의 업데이트 속도를 기준으로 일정한 배속을 곱하여 애니메이션 속도를 정합니다.
- bool useUnscaleDeltaTime : 기본값인 false를 입력하면 게임 배속(Time.timeScale)의 영향을 받습니다. true를 입력하면 게임 배속의 영향을 받지 않습니다.
- float multiplier : 게임 전체의 업데이트 속도에 일정한 비율을 곱하여 업데이트 시간을 결정합니다. 입력하지 않으면 1이 곱해집니다.
배속 설정을 기본값으로 되돌리고자 한다면 SetUpdateTimeMethod(false)로 작성해주세요.
void Update()
{
// (생략)
// D키를 누르면 콜백 함수로 재생 속도를 결정합니다.
if (Input.GetKeyDown(KeyCode.D))
{
portraitA.SetUpdateTimeMethod(OnDeltaTimeRequested, portraitA);
portraitB.SetUpdateTimeMethod(OnDeltaTimeRequested, portraitB);
portraitC.SetUpdateTimeMethod(OnDeltaTimeRequested, portraitC);
portraitD.SetUpdateTimeMethod(OnDeltaTimeRequested, portraitD);
}
}
// 각 apPortrait별 재생 속도를 리턴하는 콜백 함수입니다.
private float OnDeltaTimeRequested(object savedObject)
{
// 저장된 객체에 따라서 다른 재생 속도를 리턴합니다.
if (savedObject == (object)portraitA)
{
return Time.deltaTime / 2.0f;
}
else if (savedObject == (object)portraitB)
{
return Time.deltaTime * 3.0f;
}
else if (savedObject == (object)portraitC)
{
return Time.unscaledDeltaTime / 2.0f;
}
else if (savedObject == (object)portraitD)
{
return Time.unscaledDeltaTime * 3.0f;
}
return Time.deltaTime;
}
SetUpdateTimeMethod(OnDeltaTimeRequested onDeltaTimeRequested, object savedObject) 함수는 더욱 유연하게 재생 속도를 변경할 수 있습니다.
이 함수가 호출되는 프레임의 게임 시간을 리턴하면 되는데, 리턴값을 변경하여 애니메이션이 빠르거나 느리게 재생되도록 바꿀 수 있습니다.
이 방법의 멋진 점은, 리턴되는 게임 시간 값을 실시간으로 바꿀 수 있다는 점입니다.
예를 들어, 게임에서 캐릭터가 "느려지는 마법"에 당해서 일정 시간 동안 느려지는 것을 이 함수를 이용해서 쉽게 표현할 수 있습니다.
또는 재생 속도가 서서히 바뀌는 것을 표현하는 것도 쉽습니다.
savedObject를 입력해두면, 위와 같이 이 함수가 어느 캐릭터를 대상으로 호출되는 것인지 구분할 수 있습니다.
Time.deltaTime을 이용하면 게임 배속에 영향을 받도록 만들 수 있습니다.
반대로 Time.unscaledDeltaTime을 이용하면 게임 배속에 영향을 받지 않는 객체를 만들 수도 있습니다.
자체적인 시스템을 구현하여 유니티의 시간과 다른 별개의 게임 배속을 만드는 것도 가능합니다.
위의 각각의 경우에 따른 재생 속도의 차이를 아래의 동영상에서 확인해보세요.
참고
apPortrait의 업데이트 속도 변경 함수는 다음의 제한점이 있습니다.
- 메카님을 이용하는 경우 적용되지 않으며, 이 경우 메카님의 배속을 따릅니다.
- 물리 기능에는 적용되지 않습니다.