오늘은 스파르타 코딩 클럽 unity 게임 개발 과정 62일차(최종프로젝트 13일차 계가 느려지지 않는 버그)

2024. 1. 31. 02:15스파르타코딩클럽 게임개발

반응형

개요

저번에 게임내의 시계오브젝트에 있는 초침을 움직이게 만들었었다.

하지만 게임내에서 플레이해보니 내가 미처 생각하지 못한 버그가.. 있었는데

바로 게임내에서 시간을 느리게 하거나 멈추어도 시계의 초침은 멈추거나 느려지지 않았던 것이다.

이부분은 게임을 부분에선 문제가 없지만 보이는 부분도 중요하다고 생각하기에 수정하기로 마음 먹었다.

수정 전 핵심 코드:

DateTime currentTime = DateTime.Now;
float hoursRotation = (currentTime.Hour % 12) * 30 + currentTime.Minute * 0.5f;
float minutesRotation = currentTime.Minute * 6 + currentTime.Second * 0.1f;
float secondsRotation = currentTime.Second * 6;
ApplyRotationAndPosition(hourHand, -hoursRotation);
ApplyRotationAndPosition(minuteHand, -minutesRotation);
ApplyRotationAndPosition(secondHand, -secondsRotation);

수정 전 코드는 실제 컴퓨터 시스템에서 시간을 변수로 받게 되는데

그것을 업데이트에서 매번 새로 받게 되어 시간을 항상 현재 우리의 실제 시간과 같게 조정된다.

그것을 시계의 초침을 움직이는데 사용하게 된것.

수정 후 핵심 코드:

private DateTime startTime;
private float elapsedTimeInSeconds;
...
startTime = DateTime.Now;
...
elapsedTimeInSeconds += Time.deltaTime;
DateTime currentTime = startTime.AddSeconds(elapsedTimeInSeconds);
float hourAngle = (currentTime.Hour % 12) * 30 + (currentTime.Minute * 0.5f);
float minuteAngle = currentTime.Minute * 6 + (currentTime.Second * 0.1f);
float secondAngle = currentTime.Second * 6;
ApplyRotation(hourHand, hourAngle);
ApplyRotation(minuteHand, minuteAngle);
ApplyRotation(secondHand, secondAngle);

수정 후 코드는 컴퓨터 시스템에서 제일 처음 스타트 부분에서 startTime에 입력된다.

수정한 부분:

  • DateTime.Now를 매 프레임마다 호출하는 대신, 시작 시간(startTime)을 저장하고 Time.deltaTime을 사용하여 경과 시간을 계산.
  • 시계 바늘의 위치 설정 코드를 제거하고, 회전만 적용.

문제점 및 시도

문제점:

  • 게임의 Time.timeScale을 조정하여도 실제 시간(DateTime.Now)에 기반한 시계의 속도가 변경되지 않음.

시도:

  • 게임 내부 시간을 기반으로 시계의 시간을 계산하기 위해 게임 시작 시간과 경과 시간을 이용.

해결 방법 및 알게 된 것

해결 방법:

  • 게임 시작 할 때의 시간(startTime)을 기록하고, 매 프레임마다 경과 시간(elapsedTimeInSeconds)을 Time.deltaTime을 사용하여 누적.
  • startTime에 누적된 elapsedTimeInSeconds를 더하여 현재 시간을 계산.

알게 된 것:

  • 이 방법을 사용하면, 게임의 시간 조절(Time.timeScale)에 따라 시계의 속도를 조절할 수 있음.
  • 실제 시간과 독립적으로 게임 내 시계를 운영할 수 있어, 게임의 속도 조절에 맞게 움직임.

반응형