본문 바로가기
개발/Unity

유니티 - 타임 슬라이더 만들기 (Time Slider)

by 피로물든딸기 2022. 3. 24.
반응형

Unity 전체 링크

 

참고

- 타임 슬라이더 만들기

- Light Rotate로 간단히 낮과 밤 구현하기

- 슬라이더로 안개 조절하기

 

아래와 같이 슬라이더를 0 ~ 1로 조절하면 00 : 00 : 00 ~ 24 : 00 : 00으로 조절되는 Time Slider를 만들어보자.

 

Canvas > 빈 오브젝트 아래에 Slider와 Text를 추가한다.

Slider의 이벤트를 위해서 EventSystem도 추가해둔다.

 

DateTime을 쓰기 위해 System을 선언하고, Slider, Text를 사용하기 위해 UnityEngine.UI를 선언한다.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

 

24시간은 24시간 * 60분 * 60초 = 86400이므로 아래와 같이 define값을 정해둔다.

그리고 Slider와 Text를 public으로 선언한다.

    const int MIN_TIME_VALUE = 0;
    const int MAX_TIME_VALUE = 86400; // 24 * 60 * 60
        
    public Slider timer;
    public Text timeText;

 

Slider가 변경될 때 이벤트가 발생하기 위해서는 onValueChanged에 AddListener로 함수를 추가해야 한다.

그리고 초깃값으로 현재 시간을 value에 설정하도록 하자.

Slider의 value는 0 ~ 1 사이이므로, 현재의 시간이 86400에서 어느 정도 차지하는지 구한 후, 

0 ~ 1 사이의 값으로 변환하였다.

    void Start()
    {
        timer.onValueChanged.AddListener(delegate { valueChanged(timer, timeText); });

        DateTime dt = DateTime.Now;
        int HH = Int32.Parse(dt.ToString("HH"));
        int mm = Int32.Parse(dt.ToString("mm"));
        int ss = Int32.Parse(dt.ToString("ss"));

        timer.value = (float)(HH * 3600 + mm * 60 + ss) / MAX_TIME_VALUE;
    }

 

valueChanged는 slider와 text를 입력받아 변환한다.

slider가 0 ~ 1 사이의 값을 가지기 때문에 시간의 value 0 ~ 86400이 대응되도록 하였다.

그리고 value를 적절히 나누기, 나머지 연산을 이용해 시/분/초로 parsing 한다.

10이하의 숫자들은 앞에 0이 붙도록 startZero 함수를 이용해 변경한다.

    public string startZero(int num)
    {
        return (num < 10) ? "0" + num : "" + num;
    }

    public void valueChanged(Slider slider, Text text)
    {
        int diff = MAX_TIME_VALUE - MIN_TIME_VALUE;
        int value = MIN_TIME_VALUE + (int)(diff * slider.value); // 0 ~ 1의 값

        string h, m, s;
        int hh = value / 3600;
        int mm = (value % 3600) / 60;
        int ss = (value % 60);

        h = startZero(hh);
        m = startZero(mm);
        s = startZero(ss);

        text.text = "Time" + " " + h + " : " + m + " : " + s;
    }

 

슬라이더를 움직이면 시간이 변하는 것을 알 수 있다.

 

최종 코드는 아래와 같다.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TimeManager : MonoBehaviour
{
    const int MIN_TIME_VALUE = 0;
    const int MAX_TIME_VALUE = 86400; // 24 * 60 * 60

    public Slider timer;
    public Text timeText;

    public string startZero(int num)
    {
        return (num < 10) ? "0" + num : "" + num;
    }

    public void valueChanged(Slider slider, Text text)
    {
        int diff = MAX_TIME_VALUE - MIN_TIME_VALUE;
        int value = MIN_TIME_VALUE + (int)(diff * slider.value); // 0 ~ 1의 값

        string h, m, s;
        int hh = value / 3600;
        int mm = (value % 3600) / 60;
        int ss = (value % 60);

        h = startZero(hh);
        m = startZero(mm);
        s = startZero(ss);

        text.text = "Time" + " " + h + " : " + m + " : " + s;
    }

    void Start()
    {
        timer.onValueChanged.AddListener(delegate { valueChanged(timer, timeText); });

        DateTime dt = DateTime.Now;
        int HH = Int32.Parse(dt.ToString("HH"));
        int mm = Int32.Parse(dt.ToString("mm"));
        int ss = Int32.Parse(dt.ToString("ss"));

        timer.value = (float)(HH * 3600 + mm * 60 + ss) / MAX_TIME_VALUE;
    }
}

 

Unity Plus:

 

Easy 2D, 3D, VR, & AR software for cross-platform development of games and mobile apps. - Unity Store

Have a 2D, 3D, VR, or AR project that needs cross-platform functionality? We can help. Take a look at the easy-to-use Unity Plus real-time dev platform!

store.unity.com

 

Unity Pro:

 

Unity Pro

The complete solutions for professionals to create and operate.

unity.com

 

Unity 프리미엄 학습:

 

Unity Learn

Advance your Unity skills with live sessions and over 750 hours of on-demand learning content designed for creators at every skill level.

unity.com

반응형

댓글