스파르타 게임개발종합반(Unity)/사전캠프 공부 기록

[Unity/2D] 시간 감소 및 게임 종료, 프레임 - anchor(앵커), Time.deltaTime, Time.timeScale, ToString

테크러너 2024. 3. 28.

이전편

2024.03.28 - [Unity/2D] - [Unity/2D] 빗방울과 플레이어 충돌 체크 및 점수 올리기 - Singleton(싱글톤) 패턴

 

게임 종료 화면 Image 설정

Canvas → UI → Image 클릭해주겠습니다.

 

R : 232

G : 52

B : 78

 

 

결과

 

 

게임 종료 화면 속 텍스트 설정

 

Image 밑에 Text 생성

 

텍스트는 게임 종료화면 이미지의 크기와 항상 똑같게 하려고합니다.

우선 Rect Transform에서 네모난 그림을 클릭

 

이 상태에서 Alt+Shift를 누르면

이렇게 모양이 좀 다르게 나오는데 여기서 맨 오른쪽 하단의 모양 클릭

위와 같이 설정

 

아까 Image오브젝트의 이름은 EndPanel로 변경

 

 

결과

 

 

 

게임 종료 화면 비활성화

이후 EndPanel의 오브젝트의 체크박스를 해체하여 비활성화를 해주었습니다.

0초가 되었을 때 EndPanel을 켜주도록 하겠습니다.

 

 

결과

 

 

 

 

게임 시간 감소 구현

GameManager.cs

    public Text timeTxt;

    float totalTime = 30.0f; // 전체 시간

    void Update()
    {
        // 흘러간 시간만큼 게임 시간 감소
        totalTime -= Time.deltaTime; // 모든 기기들이 같은 시간값을 가질 수 있도록 프레임값에 대비하여 조정해준다.
        timeTxt.text = totalTime.ToString(); // 감소한 시간을 화면의 남은 시간 텍스트에 출력
    }

 

코드를 위와 같이 작성해주었습니다.

'Time.deltaTime' 은 모든 기기들이 같은 시간값을 가질 수 있도록 프레임값에 대비하여 조정해주는 기능입니다.

 

Time 오브젝트를 넣어주었습니다.

 

이후 실행해보면 남은 시간의 값이 소수점 두 번째 자리수까지만 표현하고 싶은데 넘어가는 것을 확인할 수 있습니다.

 

 

남은 시간을 소수점 두 번째 자리수까지만 표현하기

timeTxt.text = totalTime.ToString("N2");

 

ToString의 괄호 안에 'N2'라고 입력하면 소수점 두 번째 자리수까지만 표현해달라는 명령입니다.

 

그럼 이렇게 소수점 두 번째 자리수까지만 표현됩니다.

 

그리고 또 문제가 시간이 마이너스가 되도 게임이 계속 진행되는 것을 볼 수 있습니다.

0초가 되었을 때 끝내도록 하려면 아까 만들었던 EndPanel을 켜주어야 합니다.

 

 

 

0초가 되었을 때 게임 종료 화면 활성화하기

GameManager.cs

public GameObject endPanel;
게임매니저에 endPanel을 끌어다 놓을 수 있는 변수를 선언합니다.

비활성화 상태의 EndPanel 오브젝트를 넣어주었습니다.

 

    void Update()
    {
        // 시간 감소는 totalTime이 0보다 클 때만 이루어져야함
        if(totalTime > 0f)
        {
            // 흘러간 시간만큼 게임 시간 감소
            totalTime -= Time.deltaTime; // 모든 기기들이 같은 시간값을 가질 수 있도록 프레임값에 대비하여 조정해준다.
        }
        else // 게임 종료
        {
            totalTime = 0f;
            endPanel.SetActive(true); // EndPanel(게임종료 화면) 활성화, false == 비활성화
            Time.timeScale = 0f; // Time의 크기를 0으로 만들어준다
                                 // 이 의미는 첫 번째 프레임과 그 다음 프레임까지의 시간의 차이가 없어진다는 것.
                                 // 그럼 결국 게임의 시간이 멈추게 되는 효과를 연출할 수가 있다.
                                 // 그리고 미세한 오차가 발생할 수 있다.
                                 // 0 보다 큰 상태에서 어떤 값을 뺄 때 마이너스가 발생할 수 있기 때문이다.
                                 // 그래서 이를 방지하기 위해 totalTime = 0f; 라는 코드를 작성한다.
        }

        timeTxt.text = totalTime.ToString("N2"); // 감소한 시간을 화면의 남은 시간 텍스트에 출력
    }
 

코드는 위와 같이 작성해주었습니다.

totalTime = 0f;
Time.timeScale = 0f;
 

이 부분에서 Time.timeScale = 0f 라는 의미는 게임 시간을 멈추게 해주는 것입니다. 기본 설정은 1f로 시간이 흐르게 설정되어 있습니다.

주석으로도 상세히 설명이 적혀있는데요. 더 자세한 설명은 아래에 남겨놓겠습니다.

더보기

Time.timeScale을 0으로 설정하면 게임의 시간이 정지되는 효과를 줄 수 있습니다.

그러나 0보다 큰 상태에서 어떤 값을 뺄 때 마이너스가 발생할 수 있는 이유는 컴퓨터에서 부동 소수점 연산의 한계 때문입니다.

부동 소수점 연산은 컴퓨터에서 소수점을 표현하는 방법으로, 정확한 소수점 값을 표현하기 어려운 경우가 있습니다.

따라서 매우 작은 값들을 빼거나 곱할 때, 정확한 값이 아닌 근사값이 계산될 수 있습니다.

이 때문에 Time.timeScale을 0으로 설정한 후에 다시 어떤 값을 더하거나 빼는 연산을 할 때, 정확한 0이 아닌 아주 작은 음수 값이 발생할 수 있습니다.

 

따라서 0으로 설정한 후에 다시 다른 값들을 조작할 때는 부동 소수점 연산의 한계를 고려하여 조심해야 합니다. 이러한 부분을 주의하면서 프로그래밍을 하면 미세한 오차를 최소화할 수 있습니다.

 

 

(다음편으로 이어집니다) 게임 정지 상태에서 재시작 상태로 변경하려면?

2024.03.28 - [Unity/2D] - [Unity/2D] 게임 재시작 및 버튼 만들기 - On Click, Button, Time.timeScale

 

모바일 화면 크기 설정이 궁금하다면?

2024.03.28 - [Unity/기타] - [Unity] 모바일 크기 설정 / 디스플레이 설정

반응형

댓글