내가 일하며 알게 된 프로그래밍
article thumbnail

어느날처럼 회사에서 개발을 하는중이였다.

나에게 걸려온 미션은 전투가 끝나는 시점에 게임이 느려지는 하이라이트 연출을 보여주는 시점에

다른 UI에는 배속에 영향이 없도록 수정 작업이였다.

이렇게 전투가 끝날때의 화면이 느려지는 연출 상황이다.

(첨부한 GIF파일들은 회사의 프로젝트와 상관없음)


회사에서 진행중인 프로젝트는 Spine을 사용한 게임이였다.

Spine은 기본적으로 Unity의 Time.timeScale 값을 따라간다.

이미 프로젝트에서 전투에 대한 작업이 이루어졌기때문에

Unity의 timeScale값을 건드리지 않는 방법을 사용하기엔 이미 너무 많은 강을 건너버린 상태였다.


상상해보자

UI뒤에서는 전투를 하면서 시간값을 변경하고 있는데

UI에서는 Spine 캐릭터들이 시간값에 영향을 받는다면

위의 캐릭터의 Idle 애니메이션 속도가 느려졌다 원래 상태로 돌아오는 것처럼 보일것이다.

그렇다면 해결방법은 Spine의 애니메이션 속도를 Unity timeScale 값을 실시간으로 1배속값으로 맞춰주면 된다.


답은 생각보다 간단하였다.

private SkeletonAnimation skeletonAnimation;

private void FixedUpdate()
{
	if (skeletonAnimation != null)
	{
    		//분모가 0인 상황을 주의
		if (Time.timeScale > 0f)
		{
        		//Spine 애니메이션의 속도를 항상 1배속처럼 보이도록 맞춘다.
        		skeletonAnimation.timeScale = 1f / Time.timeScale;
		}
	}
}

DivideByZeroException 이 나지않도록 주의한다.


사실 위의 작업은 게임을 하면서 에러나 버그가 날만한 요인이 아니다.

단지 그냥 "어 얘네 전투 끝날때 UI에 보이는 캐릭터도 같이 느려지네" 라고 생각할 문제지만

디테일적인 부분에서 이런 작업들이 모여서 게임의 완성도를 높인다고 생각한다.

위 작업을 하고나서 지금 생각했을때 아쉬운 부분은

굳이 FixedUpdate 때 매프레임마다 위의 작업을 할 필요는 없었다.

전투가 끝나는 시점만 처리를 했으면 더욱 깔끔했을 코드다.

profile

내가 일하며 알게 된 프로그래밍

@CtrlVGames