내일배움캠프 TIL

내일배움캠프 55일차 TIL "시간마다 갱신되는 UI만들기"

Jooglorystar 2024. 12. 4. 20:59

 

 

오늘은 그동안 만들었던 TimeManager의 값을 UI로 잘 받아 올 수 있는지 기능을 구현해봤다.

 

 

 

우선 TextMeshPro UI만 대략적으로 배치를 하고, 해당되는 값을 불러오는 코드를 작성해봤다.

 

단순히 값을 반영하는 방법은 Update문에서 계속 체크를 하는 것이지만, 해당 값들은 항상 변하는 값이 아니고, 가장 빠르게 변하는 Time도 실제 게임에선 5~7초에 한번씩만 갱신이 되기 때문에 Update문에서 불러오는 것은 불필요하다고 생각했다.

 

또한, 요일과 날짜는 하루에 한번 갱신되고, 계절은 28일이 지난 후에만 갱신되며, 년 또한 계절 사이클이 모두 돌면 바뀌므로, 그때마다 한번씩만 갱신을 하게 해주면 된다 생각이 들었다.

 

그래서 TimeManager에 다음과 같이 추가했다.

 

public event Action OnTimeCheck;
public event Action OnDayCheck;
public event Action OnSeasonCheck;
public event Action OnYearCheck;

private void CheckDelegate()
{
    if (_lastCalculatedDay != _inGameTotalDay)
    {
        CallDayCheck();
        _lastCalculatedDay = _inGameTotalDay;
    }
    if (_lastCheckedSeason != _currentSeason)
    {
        CallSeasonCheck();
        _lastCheckedSeason = _currentSeason;
    }

    if (_lastCheckedYear != _currentGameYear)
    {
        CallYearCheck();
        _lastCheckedYear = _currentGameYear;
    }
}

// CallXXXCheck메서드들은 해당되는 OnXXXCheck?.Invoke()만 호출하는 메서드임

 

 

그리고 TimeUI에서 다음과 같은 메서드를 작성했다.

 

private void Start()
{
    GameManager.Instance.TimeM.OnTimeCheck += UpdateTimeText;
    GameManager.Instance.TimeM.OnDayCheck += UpdateDayText;
    GameManager.Instance.TimeM.OnSeasonCheck += UpdateSeasonText;
    GameManager.Instance.TimeM.OnYearCheck += UpdateYearText;
}

private void UpdateTimeText()
{
    _TimeText.text = GameManager.Instance.TimeM.GetTimeToString();
}

private void UpdateDayText()
{
    _dayText.text = GameManager.Instance.TimeM.InGameDay.ToString();
    _weekDayText.text = WeekDayToString();
}

private void UpdateSeasonText()
{
    _seasonText.text = GameManager.Instance.TimeM.CurrentSeason.ToString();
}

private void UpdateYearText()
{
    _yearText.text = GameManager.Instance.TimeM.InGameYear.ToString();
}

private string WeekDayToString()
{
    return GameManager.Instance.TimeM.CurrentWeekDay.ToString().Substring(0, 3);
}

 

각 텍스트를 갱신하는 메서드들을 각 때마다 체크하는 이벤트에 구독하고, 각 이벤트들은 해당 값이 변할 때 갱신되도록 했다.

이를 통해, 각 UI가 필요할 때만 갱신되도록 구현할 수 있었다.