유니티(Unity) 프로그래밍

유니티3D 아날로그 시계

게임첫걸음 2024. 9. 19. 17:29

시계

 이번 글은 실제 시간에 따라 움직이는 아날로그시계를 만들어보겠습니다. 우선 전역변수 먼저 선언하겠습니다.

[SerializeField] private Transform SecCubeTr = null;
[SerializeField] private Transform MinCubeTr = null;
[SerializeField] private Transform HourCubeTr = null;

[SerializeField] private float distance = 2.0f;

private float Secangle = 0f;
private float Minangle = 0f;
private float Hourangle = 0f;
  • SecCubeTr: 초침을 의미하는 큐브오브젝트의 위치값
  • MinCubueTr: 분침을 의미하는 큐브오브젝트의 위치값
  • HourCubeTr: 시침을 의미하는 큐브오브젝트의 위치값
  • distance: 초, 분, 시침 큐브들과 중심과의 거리
  • Secangle: 초침 각도
  • Minangle: 분침 각도
  • Hourangle: 시침 각도

위에서 처음 다루는 각도에 대해 알아보겠습니다. 오브젝트의 각도, 회전과 관련된 특징이 Translate의 Rotate값이 있습니다. Rotate를 이곳에서 다루는 이유는 거리에 따른 큐브의 위치를 여러 각도에 위치시키기 위해서입니다. 

각도 사용 이유

바늘 역할을 할 큐브의 위치가 중심과 특정 거리를 유지한 상태로 시계방향으로 움직여야 하기 때문입니다. 이제 초침을 시작으로 그에 따른 메서드들을 만들어보겠습니다.

 

<초침>

private void SecBoxTr()
    {
        float totalSeconds = (float)System.DateTime.Now.TimeOfDay.TotalSeconds;
        float seconds = totalSeconds % 60.0f;
        float Secangle = -seconds * 6.0f + 90f;

        float x = Mathf.Cos(Secangle * Mathf.Deg2Rad);
        float y = Mathf.Sin(Secangle * Mathf.Deg2Rad);
        SecCubeTr.position = new Vector3(x, y, 0f) * distance;
    }
  • totalSeconds : 전체 초를 나타냅니다. (전체 시간)
  • System.DateTime.Now.TimeOfDay.TotalSeconds: 현재 날짜의 지금 시간을 초로 표현해 달라는 함수입니다.
  • seconds : 위의 totalSeconds를 60으로 나눴을 때의 나머지 (실질적으로 시침이 가리킬 값)
  • Secangle : 시침이 매 초마다 가질 각도값 
  • * 6.0f : 360도를 표현해야하는 시계의 특성 때문에
  • + 90f : 시계의 12시를 기준점으로 잡기 때문. 0도는 보통 x축의 양의 방향을 가리키지만, 시계에서는 12시 방향이 0도(또는 90도)로 간주되기 때문에 시작 때 90도를 미리 더한다는 개념.

+90f의 의미

즉 x축 0도에서 시작되는 angle에 12시부터 시작할 수 있도록 90도를 추가해 준 겁니다.

 이제 Mathf.*** 문을 알아보겠습니다. Mathf문은 수학적 기능을 사용하겠다는 뜻입니다. 학창 시절에 배운 Sin, Cos, Tan, 등을 이용하겠다는 뜻입니다.

https://docs.unity3d.com/kr/2021.1/Manual/class-Mathf.html

 

중요 클래스 - Mathf - Unity 매뉴얼

Unity의 Mathf 클래스는 게임 및 앱 개발에 일반적으로 필요한 삼각 함수, 로그 함수, 기타 함수를 비롯한 일반적인 수학 함수 컬렉션을 제공합니다.

docs.unity3d.com

유니티에서 직접 정리해준 Mathf문의 기능들입니다. 참고용으로 보시면 될 듯합니다. 이번 글에선 Cos, Sin, Rad, Degree를 다뤄보겠습니다.

  • sinA = a/h
  • cosA = b/h
  • tanA = a/b (sin, cos 다룰 때 같이 나와서 설명)
  • Degree: 도 (90도, 180도, 360도) 등
  • Radian(호도법): 원주 호의 길이가 반지름과 같아지는 길이가 될 때의 각도를 정의

Radian 설명

위의 코드에서 Deg2Rad을 사용하였습니다. 이는 도(Degree)를 라디안(Radian)으로 변환하는 함수입니다.

float x = Mathf.Cos(Secangle * Mathf.Deg2Rad);
float y = Mathf.Sin(Secangle * Mathf.Deg2Rad);
SecCubeTr.position = new Vector3(x, y, 0f) * distance;

여기서 x, y의 값에 Mathf.Deg2 Rad를 곱하는 이유는 Cos, Sin 함수는 각도를 라디안 단위로 받아들입니다. 그래서 Secangle의 도를 Radian으로 바꾼다는 뜻입니다. 그리고 초침큐브의 위치를 (x, y, 0f) 좌표계에 중심과의 거리값인 distance를 곱하여줍니다. 분침과 시침도 초침과 같이 만들어주면 됩니다.

private void SecBoxTr()
    {
        float totalSeconds = (float)System.DateTime.Now.TimeOfDay.TotalSeconds;
        float seconds = totalSeconds % 60.0f;
        float Secangle = -seconds * 6.0f + 90f;

        float x = Mathf.Cos(Secangle * Mathf.Deg2Rad);
        float y = Mathf.Sin(Secangle * Mathf.Deg2Rad);
        SecCubeTr.position = new Vector3(x, y, 0f) * distance;
    }
    
private void MinBoxTr()
    {
        float totalSeconds = (float)System.DateTime.Now.TimeOfDay.TotalSeconds;
        float minute = (totalSeconds % 3600.0f) / 60.0f;
        float Minangle = -minute * 6.0f + 90f;

        float x = Mathf.Cos(Minangle * Mathf.Deg2Rad);
        float y = Mathf.Sin(Minangle * Mathf.Deg2Rad);
        MinCubeTr.position = new Vector3(x, y, 0f) * distance;
    }

private void HourBoxTr()
    {
        float totalSeconds = (float)System.DateTime.Now.TimeOfDay.TotalSeconds;
        float hour = totalSeconds / 3600.0f;
        float Hourangle = -hour * 30f + 90f;

        float x = Mathf.Cos(Hourangle * Mathf.Deg2Rad);
        float y = Mathf.Sin(Hourangle * Mathf.Deg2Rad);
        HourCubeTr.position = new Vector3(x, y, 0f) * distance;
    }

 이제 위의 3개의 메서드를 Update()에 추가하고 전역에 선언한 변수들에 그에 맞는 오브젝트를 지정하여 진행하면 원활히 굴러가게 된다.

 

'유니티(Unity) 프로그래밍' 카테고리의 다른 글

Unity Collider(Trigger, Collision)  (2) 2024.09.24
Unity 충돌감지  (1) 2024.09.20
Unity3D 추격2  (1) 2024.09.18
Unity3D 추격  (1) 2024.09.12
Unity3D에 유용한 기능들 (1)  (2) 2024.09.04