ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7일차 게임 끝내기
    개발일지/스파르타 코딩클럽 유니티 강의 2024. 3. 27. 15:36

    이번 강의 중에는 문제가 좀 발생했었는데

    찾는 과정이 꽤 재밌었다

     

    오늘 배운 내용

    • 판넬 만들기
    • 폰트, 점수, 버튼 등 만들기
    • gameManager 싱글톤 처리
    • 게임 종료하기
    • 현재 점수 보여주기
    • 다시하기 만들기

    새로 알게 된 내용

     

    Update() 함수를 멈추게 하기

    bool isRunning = true;
    
    void Update()
    {
        if (isRunning)
        {
            alive += Time.deltaTime;
            timeTxt.text = alive.ToString("N2");
        }
    }
    
    public void gameOver()
    {
        isRunning = false;
        Time.timeScale = 0.0f;
        thisScoreTxt.text = alive.ToString("N2");
        endPanel.SetActive(true);
    }

    Update()함수와 gameOver() 함수 사이에 시간차이가 있어서

    게임 종료 후에 실제 시간과 현재 점수에 약간의 오차가 발생하는데

    bool값으로 Update()와 gameOver() 를 동시에 멈추게 했다.

    지금까지 시간경과로 점수를 매기는 형식의 게임을 만들어본 적이 없어서

    이런 경우는 처음이었다.

     

    오늘 발생한 문제

     

    네모와 풍선이 부딪혀도 게임이 끝나지가 않았다

    public GameObject endPanel;
    
    public void gameOver()
    {
        Time.timeScale = 0.0f;
        endPanel.SetActive(true);
    }

    분명 gameManager에 endPanel도 불러오고.. gameOver() 함수도 완벽하게 작성했고

    void OnCollisionEnter2D(Collision2D coll)
    {
        if (coll.gameObject.tag == "balloon")
        {
            gameManager.I.gameOver();
        }
    }

     square.cs에도 충돌 시에 gameOver() 함수가 발생하도록 작성을 잘 했는데

    여러번 시도해도 계속 충돌해도 게임이 끝나지가 않았다.

    이것 저것 건드려보면서 OnCollisionEnter2D() 함수 앞에 자동완성으로 private가 있길래

    아 이거 때문이구나 하면서 지웠는데도 되지않고.. 한 20분을 헤맸는데 문제는 다른 곳에 있었다.

    매우 바보같은 실수였는데

    public static gameManager I;
    
    void Awake()
    {
        I = this;
    }

    gameManager를 싱글톤화 시키는 과정에서

    싱글톤은 해놓고

    void Awake() 함수 작성을 까먹고 하지 않아서..

    square.cs에서 gameManager를 부르지 못해 발생한 일이었다.

     

    게임 다시 시작하기

     

    게임을 다시 시작하는 과정에서도 문제가 발생했었다.

    using UnityEngine.SceneManagement;
    
    public void retry()
    {
        SceneManager.LoadScene("MainScene");
    }

    분명 SceneManagement도 불러냈고..

    retry 함수도 완벽하게 작성했다.

    그리고 다시하기 버튼에 retry 함수가 실행되도록 했는데도..

    난 아무리 버튼을 눌러도 다시하기가 발생하지 않았다.

    왜 그럴까 강의를 계속 돌려보아도 문제를 찾지 못하던 찰나

    한 단어가 내 눈에 들어왔다.

    SampleScene 이었다.

    코드는 SceneManager.LoadScene("MainScene"); 라고 mainScene을 다시 시작하는 코드를 적었는데

    알고보니 게임은 SampleScene이었던 것.. 당연히 다시시작이 안될 수 밖에 ㅠㅠ..

    Asset/Scene 에서 sampleScene을 rename으로 mainScene으로 변경한 후에 정상작동 되었다.

     

    중요하게 생각하는 부분

    다시시작할때 시간을 다시 흐르게하기

    void Start()
    {
        Time.timeScale = 1.0f;
        InvokeRepeating("makeSquare", 0.0f, 0.5f);
    }

    start 함수 안에 Time.timeScal = 1f; 로 시간을 흐르게하지 않으면

    다시하기를 눌렀을 때 다시 시작은 되지만 시간이 흐르지않아 멈춘 상태로 있게 된다.

     

    저번 시간과 똑같은 점수 불러오기

    public Text thisScoreTxt;
    
    public void gameOver()
    {
        Time.timeScale = 0.0f;
    		thisScoreTxt.text = alive.ToString("N2");
        endPanel.SetActive(true);
    }

    thisScoreTxt.text = alive.Tostring("N2"); 저번에는 timtTxt.text에 똑같이 썼는데

    간단하게 흐른 시간과 점수가 같은 경우일 때 사용

     

    나머지 중요한 점은 발생한 문제에서 ..

     

    오랜만에 실행 안되는 부분을 찾느라 재밌었다.

    물론 왜 안되는지 머리를 골리는 것은 한시간 안으로만 재밌다.. 그 이상 가면

    항상 피폐해졌던 경험이..

Designed by Tistory.