본문 바로가기

mingsDB

유니티에서 낮과 밤을 표현하자

728x90

오늘은 유니티 환경에서 한국시간에 맞춰 낮과 밤을 구현하는 방법에 대해 글을 쓰고자 합니다.

우선 일출시간과 일몰시간을 아래와 같이 간단하게 구성했습니다

 

그 후 360° 를 기준으로 하루가 지나며 180°를 기준으로 낮과 밤이 변합니다  따라서 각도는

  • 1시간 → 15°
  • 30분 → 7.5°
  • 1분 → 0.25°

만큼 회전합니다.

따라서 유니티를 실행한 시간에 시간과 분을 가져온 후 시간에 맞춰 각도를 조절하고 10분마다 2.5°씩 회전하는 방식으로 구성했습니다.

 

먼저 한국 시간을 가져올 필요가 있습니다. 코드는 아래와 같습니다.

int utcNow = DateTime.UtcNow.Hour;
int NowHour = utcNow + 9; // 한국시간 적용을 위해 UTC + 9 시간 적용
int NowMinute = DateTime.Now.Minute; // 현재 분(min) 가져오기

 

물론 DateTime.Now를 사용하면 되지 않냐는 생각을 하실 수도 있으나 해당 코드를 영국에 가서 실행해야 하기에 UTC 즉, 국제 표준시를 사용한 후 +9를 하는 방식으로 한국 시간을 가져오게 만들었습니다. 

 

낮과 밤을 표현하기 위해 빛을 조절해야 할텐데 저는 가장 간단하게 Directional Light의 X축을 회전하는 방식으로 낮과 밤을 표현하기로 했습니다.

 

현재시간을 가져온 후 그에 따라 Directional Light의 X축을 회전하고 10분마다 추가적인 회전을 하도록 코드를 구현했고 아래와 같습니다.

(0~5시 사이의 경우 밤이지만 6(Sun rise)보다 값이 작기에 부가적인 코드를 추가했습니다.)

public class MainLightRotation : MonoBehaviour
    {

        public Light directionalLight;
        private float RotationH = 0;
        private float AngleH = 15; // 시간 당 회전할 각도 
        private float RotationM = 0;
        private float AngleM = 0.25f; // 분 당 회전할 각도
        private float Rotation = 0;
        int StandardHour = 6;

        void Start()
        {
            int utcNow = DateTime.UtcNow.Hour;

            int NowHour = utcNow + 9; // 한국시간 적용을 위해 UTC + 9 시간 적용
            int NowMinute = DateTime.Now.Minute; // 현재 분(min) 가져오기 
            // 0~5시 사이의 값 조정
            if (NowHour - 6 < 0)
            {
                RotationH = (NowHour + 24 - StandardHour) * AngleH;
            }
            else
            {
                RotationH = (NowHour - 6) * AngleH;
            }
            RotationM = NowMinute * AngleM;
            Rotation = RotationH + RotationM;
            directionalLight.transform.localRotation = Quaternion.Euler(Rotation, 0, 0);
            StartCoroutine(LightRotate());
        }

        // 일출 일몰 적용 코드 
        IEnumerator LightRotate()
        {
            while (true)
            {
                Rotation += 2.5f;
                directionalLight.transform.localRotation = Quaternion.Euler(Rotation, 0, 0);
                yield return new WaitForSecondsRealtime(600);
            }

        }

    }

 

결과적으로 아래와 같이 낮과 밤이 잘 표현되는 것을 볼 수 있습니다. (저의 유니티는 태양이 돕니다...ㅎㅎ)

WaitForSecondsRealtime(0.05)로 설정했습니다

'mingsDB' 카테고리의 다른 글

Ubuntu) VS Code 터미널에서 상태 확인  (0) 2024.10.02
[SCP]원격 파일 전송  (1) 2024.09.18
vs code 효과음 끄기  (0) 2024.08.28
Unity WebSocket 통신  (0) 2024.08.14
MACs & FLOPs 측정하기  (0) 2024.07.17