스파르타코딩클럽 게임개발

오늘은 스파르타 코딩 클럽 unity 게임 개발 과정 59일차(최종프로젝트 10일차 시계를 만들어보자)

코드천자문 2024. 1. 29. 02:48
반응형

프로젝트에서 시계 오브젝트를 사용하게 되었다.
하지만 이 오브젝트의 에셋은 그저 3d모델만 달랑있는 에셋.
하지만 난 이 에셋을 실제 시간에 맞춰서 움직이도록 만들고 싶었기에 새로운 스크립트를 작성하기로 하였다.

에셋은 다행이 시침과 분침 초침의 움직임이 각각 나뉘어져있고 로케이션의 z값으로 회전을 조정할 수있었다.

Unity 시계 침 움직임 관련

1. 기본 개념

  • 시계의 시침, 분침, 초침을 실제 시간에 따라 움직이게 하는 작업.
  • 스크립트를 사용하여 현재 시간을 기반으로 각 침의 회전 각도를 계산.

2. 시도한 방법들과 해결방법

  • 첫 번째 시도: 초침, 분침, 시침이 각각 독립적으로 움직이도록 설정.
    • 문제: 초침이 매 초마다 점프하듯 움직임.
    • 해결: DateTime.Millisecond를 사용하여 부드러운 움직임 구현.
    DateTime.Millisecond는 현재 시간의 밀리초 부분을 나타낸다. 밀리초는 1초를 1000으로 나눈 값으로, 초의 1/1000에 해당하는 시간 단위이고 이를 사용하여 초침의 움직임을 더욱 세밀하게 조절할 수 있으며 또 예를 들면, 0.5초는 500밀리초
float secondAngle = currentTime.Second * 6 + (currentTime.Millisecond * 0.006f);
  • 두 번째 시도: 부모 객체의 회전 값과 상관없이 각 침들이 독립적으로 움직이도록 설정.
    • 문제: 부모 객체의 회전에 따라 침들의 방향이 바뀜.
    • 해결: 침들이 부모 객체의 x, y 회전 값을 상속받고, z축 회전만 독립적으로 수행하도록 변경.

부모 객체의 로테이션의 값을 변경하였지만 침들의 회전은 고정되어 변화하지 않기에 이렇게 수정하였다.

hourHand.transform.rotation = Quaternion.Euler(new Vector3(hourHand.transform.parent.eulerAngles.x, hourHand.transform.parent.eulerAngles.y, -hourAngle));
  • 세 번째 시도: 침들이 반시계 방향이 아닌 시계 방향으로 움직이도록 수정.
    • 문제: 침들이 반시계 방향으로 움직임.
    • 해결: 각도 계산에서 마이너스 부호 제거하여 시계 방향으로 변경.

이제 완성되었다고 생각하여 마무리 할려고 했으나 자세히 들여다 보니 반시계방향으로 회전하고 있었다.

그래서 양수였던 값을 음수로 바꾸었다.

hourHand.transform.rotation = Quaternion.Euler(new Vector3(hourHand.transform.parent.eulerAngles.x, hourHand.transform.parent.eulerAngles.y, hourHand.transform.parent.eulerAngles.z + hourAngle));

3. 원리 및 원칙

  • 회전 각도 계산: 시간, 분, 초에 따라 각각 다른 비율로 회전 각도를 계산.
  • 부드러운 움직임: DateTime.Millisecond를 사용하여 초침의 움직임을 더 부드럽게 함.
  • 상속 및 독립적 회전: 부모 객체의 회전을 상속받되, z축 회전은 독립적으로 처리.

4. 사용한 이유

  • QuaternioneulerAngles: eulerAngles를 사용한 이유는 간단하고 이해하기 쉬운 오일러 각을 이용하여 회전 값을 계산하고 적용하기 위해서였다.코드에서는 시침, 분침, 초침의 회전 값을 각도로 표현하기 위해 eulerAngles를 사용하였으며,이는 Unity에서 제공하는 편리하고 가독성이 좋은 기능이다. 다만, 정확성이나 Gimbal Lock과 같은 문제가 발생할 수 있고 더 복잡한 회전 동작이 필요한 경우에는 Quaternion을 사용하는 것이 더 적합하지만 현재 시계를 구현하기에는 충분히 사용할 만 하다고 생각했다.
반응형