<Button 작동 안되는 버그>

플레이어와 몬스터, 그리고 게임 종료 화면 UI 부분을 합치면서 Button이 눌리지 않는 버그가 발생했다. 스크립트와 오브젝트 전부 다 연결이 잘 되어 있는데 Debug를 찍어보아도 콘솔창에 로그가 찍히지 않았다.

왜 그런가 전 작업물과 비교해보니 EventSystem이 없어서 그런 것이었다.

 

EventSystem은 한 Scene에 하나만 생성되는 input 기반의 오브젝트에 이벤트를 보내는 시스템으로 Canvas를 생성할 때 Scene에 같이 생성되며, 삭제 했을 때 다시 Canvas를 생성하면 따로 자동으로 다시 생성되지 않는다.

 

Button이 작동되지 않았던 이유는 하이어라키에 있는 모든 오브젝트들을 Prefabs로 빼서 관리하는 과정에 실수로 삭제한 것 같다.생성은 간단하다. UI - Event System을 누르면 해결된다.

 

 

<Best Time 나타내기>

합치면서 Best Time을 저장하는 기능을 구현하지 않았다는 사실을 깨달았다.

Best Time은 게임이 재시작되거나 꺼져도 저장되고 남아있어야하는 기능으로, 구현 방법은 다양하다. 예전에 강의에서 배웠던 PlayerPrefs라는 기능을 사용하여 구현하기로 했다.

PlayerPrefs는 데이터를 저장하거나 꺼낼 때 항상 key, value 페어로 저장한다. SetFloat, SetInt는 숫자, SetString은 문자열을 저장한다. PlayerPrefs.HasKey()는 데이터를 저장했는지 확인하는 메서드로, bool값을 반환시킨다.

 

최고 점수( Best Time) 역시 타이머 형식으로 저장할 것이기 때문에 메서드로 만들어준다.

타이머 형식을 정해놨기 때문에 그냥 현재 점수와 최고 점수를 나눠서 만들었다.

private string UpdateTime()
{
    // 타이머 표시
    time += Time.deltaTime;
    int hour = (int)time / 3600;
    int min = (int)time % 3600 / 60;
    int sec = (int)time % 3600 % 60;
    timeTxt.text = string.Format("{0:D2}:{1:D2}:{2:D2}", hour, min, sec);
    return timeTxt.text;
}

private string BestTimeScore(float bestScore)
{
    // 타이머 표시
    float time = bestScore;
    int hour = (int)time / 3600;
    int min = (int)time % 3600 / 60;
    int sec = (int)time % 3600 % 60;
    timeTxt.text = string.Format("{0:D2}:{1:D2}:{2:D2}", hour, min, sec);
    return timeTxt.text;
}

 

현재 점수가 최고 점수보다 높다면 갱신한다.

public TMP_Text bestScoreTxt;

public void GameOver()
{
    isRunning = false; // 시간 멈추기
    Time.timeScale = 0f;
    endPanel.SetActive(true);

    // 게임오버 시간이 현재 시간에 뜨도록
    currentScoreTxt.text = timeTxt.text;

    if (PlayerPrefs.HasKey("bestScore") == false)
    {
        PlayerPrefs.SetFloat("bestScore", time);
    }
    else
    {
        if (PlayerPrefs.GetFloat("bestScore") < time)
        {
            PlayerPrefs.SetFloat("bestScore", time);
        }
    }
    float bestScore = PlayerPrefs.GetFloat("bestScore");

    bestScoreTxt.text = BestTimeScore(bestScore);
}

 

 

완벽히 이해하지 못하고 사용해서 자료형을 변형시킨다던지 등 상황에서 맞게 유동적으로 사용하지 못한게 아쉽다. 그리고 주말에 싱글톤과 싱글톤의 객체지향적이지 못하다는 단점을 보완한 Service Locator Pattern에 대해 공부해보아야겠다.

+ Recent posts