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