사전캠프/Unity

4주차 과제 - 30초가 지나면 게임 끝내기

서보훈 2024. 8. 26. 16:17

카드 게임인 만큼 속도감 있게 만들어 볼까요?

  • 30초간 플레이하면 게임이 종료되는 시스템을 추가해봅시다!

GameManager.cs 에 30초가 지나면 게임이 종료되도록 기능을 추가해주어야합니다.

현재, GameManager 스크립트입니다.

public class GameManager : MonoBehaviour
{
    #region singleton
    public static GameManager Instance;

    private void Awake()
    {
        if(Instance == null)
        {
            Instance = this;
        }
    }
    #endregion

    public Text timeText;
    float time = 0.0f;

    public Card firstCard;
    public Card secondCard;

    public int cardCount = 0;

    public GameObject endText;

    public AudioSource audioSource;
    public AudioClip clip;

    private void Start()
    {
        Time.timeScale = 1.0f;
        audioSource = GetComponent<AudioSource>();
    }

    private void Update()
    {
        time += Time.deltaTime;
        timeText.text = time.ToString("N2");
    }

    public void IsMatched()
    {
        if(firstCard.index == secondCard.index)
        {
            audioSource.PlayOneShot(clip);

            firstCard.DestoyCard();
            secondCard.DestoyCard();
            cardCount -= 2;

            if (cardCount == 0)
            {
                endText.SetActive(true);
                Time.timeScale = 0f;
            }
        }
        else
        {
            firstCard.CloseCard();
            secondCard.CloseCard();
        }

        firstCard = null;
        secondCard = null;
    }
}

Update가 호출될때마다 time 변수에 time.deltaTime, 즉 한번 라이프사이클이 돌아가는데 걸린 시간이 더해지고 있습니다.

 

이 변수를 사용해서 30초가 지나면 게임이 끝나도록 만들 수 있을것 같습니다.

 

또한 30초가 지났는지 계속 확인해야할 필요가 있습니다.

그렇기때문에 Update 에서 30초가 지났는지 확인하고, 30초가 지나면 게임을 종료하도록 해야합니다.

 

해당 스크립트의 Update문만 보도록 하겠습니다.

private void Update()
{
    time += Time.deltaTime;
    timeText.text = time.ToString("N2");

    if(time >= 30f)
    {
        endText.SetActive(true);
        Time.timeScale = 0f;
    }
}

 

Update에 if문을 추가해주었습니다.

time 변수가 30보다 크거나 같아지면, endText 오브젝트를 활성화하고, timeSacle을 0으로 만들어 게임을 멈춤니다.

조건문을 30이상으로 잡아야하는 이유는 time.deltaTime을 time 변수에 더하는것이기 때문에, 정확히 30이 나오지 않을가능성이 더 높기 때문입니다.

 

현재는 게임종료 방식이 게임클리어, 시간 초과 2종류이기 때문에 각각 사용해도 무관하지만 프로젝트의 규모가 커질경우 게임이 종료되는 순간이 많아질 수 있기 때문에 게임 종료를 함수화 해서 사용하는것이 유용합니다.

public class GameManager : MonoBehaviour
{
    //... 생략
    private void Update()
    {
        time += Time.deltaTime;
        timeText.text = time.ToString("N2");

        if(time >= 30f)
        {
            GameOver();
        }
    }

    public void IsMatched()
    {
        //...생략
            if (cardCount == 0)
            {
                GameOver();
            }
        //... 생략
    }
    public void GameOver()
    {
        endText.SetActive(true);
        Time.timeScale = 0f;
    }
}