본문 바로가기
유니티 최고/유니티 구현

유니티(Unity) DateTime(현재시간)에 대해서 + 유니티 공간상 낮과 밤 구현하기

by Lee_story_.. 2024. 4. 19.
728x90

 

 

 

유니티 어플리케이션에서 현재 시간을 들고 오는 일은 많이 없겠지만... 

이번에 유니티 공간상에 실제 시간을 적용시키는 기능을 개발하고자 사용해 보았습니다!

 

 

 

 

 

 

우선 현재 시간을 유니티에 받아오는 것은 생각보다 간단하게 해결가능합니다

바로 DateTime를 사용하는것!

 

 

DateTime


당장 아래 now함수만 사용해도

DateTime.now()

 

바로 출력해보면 아래와 같은 값을 받을 수 있습니다.

 

 

 

년도, 월, 일, 시간, 분, 초... 너무 많다면!

 

아래와 같이 포맷을 지정해서 출력 받을 수 있습니다. 

 

// - 4/19/2024 10:30:15
print(DateTime.Now);

//2024 4월 19 10:30:15
print(temp.ToString("yyyy MMMM dd  HH:mm:ss"));

 

 

 

 

더 많은 포맷 방법이 있겠지만 기본적으로는 아래와 같습니다. 

 

        //년도
        print(temp.ToString("yy")); 	// 24
        print(temp.ToString("yyyy")); 	// 2024
        
		//월
        print(temp.ToString("MM"));		//04
        print(temp.ToString("MMMM"));	//4월

		//일
        print(temp.ToString("dd"));		//19
        print(temp.ToString("dddd"));	//금요일

		//시간
        print(temp.ToString("HH"));		//14
        print(temp.ToString("hh"));		//2
        
        // 분과 초도 동일!
        
        //++ tt는 오전 오후 출력!

 

 

 

 

 

 

 

 

 

여기까지가 출력하는 부분이였다면,

아래와 같이 작성하면,  시간의 부분부분을 따로 변수로 받아 줄 수도 있습니다. 

DateTime temp = DateTime.Now;


int hour = temp.Hour;
int Minute = temp.Minute;
int Year = temp.Year;
int Month = temp.Month;

 

 

 

여기까지가 기본적인 부분은 끝! 인것 같습니다. 

 

 

 

이제 DateTime을 이용해서 유니티 공간상에 낮과 밤을 만들어 보겠습니다!

 

 

 

구현!


 

우선 하나의 에셋을 받아줍시다

 

 

 

Simple Sky - Cartoon assets | 3D 주변환경 | Unity Asset Store

Elevate your workflow with the Simple Sky - Cartoon assets asset from Synty Studios. Find this & other 주변환경 options on the Unity Asset Store.

assetstore.unity.com

 

 

위 에셋에서 SkyDome 이라는 오브젝트를 제공해주는데, 

오브젝트에 적용되어 있는 머터리얼의 오프셋만 조절해준다면 아래처럼 낮과 밤을 쉽게 만들어 줄 수 있습니다!

 

 

 

이제 DateTime을 적용시켜 줍시다 .

 

 

우선 아래와 같이 코드를 작성해 주었습니다.

    public MeshRenderer[] SkyDome= new MeshRenderer[2];
    public Light Light;

    public GameObject LightObj;

    public Text text;
 
    private Material[] Sky=new Material[2];

    float offset = 0f;
    float light_str = 1.5f;


....

void TimeCheck()
    {
        DateTime temp = DateTime.Now;

        int hour = temp.Hour;

        SkyChangeCal(hour);
    }


public void SkyChangeCal(int a)
    {
        Sky[0] = SkyDome[0].material;
        Sky[1] = SkyDome[1].material;

        text.text = a.ToString() + " 시 ";


        if (a==12) // 낮
        {
            offset = 0;
            light_str = 1.5f;

        }
        else if (a==0) // 밤
        {
            offset = 0.5f;
            light_str = 0.5f;
        }
        else
        {
            int temp = a%12;

            if (a/12 == 1){ // 오후
                offset = (0.5f / 12f) * temp;
                light_str = 1.5f - (2f / 24f) * temp;
            }
            else //오전
            {
                offset = 0.5f - (0.5f / 12f) * temp;
                light_str = 0.5f + (2f / 24f) * temp;
            }
        }


        Sky[0].SetTextureOffset("_MainTex", new Vector2(offset, 0));
        Sky[1].SetTextureOffset("_MainTex", new Vector2(offset, 0));

        Light.intensity = light_str;
    }

 

 

단순히 오브젝트의 머터리얼을 받아와 오프셋을 조절하고,

여기서 추가적으로 Light에 대한 강도를 조절하는 함수입니다. 

 

수치의 경우 저는

 

0시

라이팅은 0   / 오프셋은 1.5

 

오전 12시

라이팅 0.5  / 오프셋 0.5

 

 

로 세팅하여 계산해주었기에 이 부분은 따로 수정해주시면 될 것같습니다.

 

여기서 timeCheck를 실행해주면 현재시간에 맞게끔 공간이 구성되게 됩니다!

 

 

여기서 잠깐 테스트 위해 코루틴을 하나 작성해 주겠습니다.

2초마다 함수를 실행하는 

    void Start()
    {

        StartCoroutine(SkyChange());
    }
    
    
...


IEnumerator SkyChange()
    {
        int time = 0;
        while (true)
        {
            yield return new WaitForSeconds(2f);

            time += 1;
            SkyChangeCal(time);

            if (time == 24)
            {
                time = 0;
            }

        }
    }

 

 

 

실행하면! 아래처럼구성되게 됩니다

 

 

 

시간 단위로 변경되는 코드라 뚝뚝끊어지지만... 

이정도만 되어도 나쁘지 않은것 같습니다!

 

(분단위로 계속 최신화 하면 너무 무거워질거 같은 느낌....)

 

 

 

여기까지가 끝!

 

 

 

틀린점이 있다면 댓 달아주세요!

댓글