-
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에 똑같이 썼는데
간단하게 흐른 시간과 점수가 같은 경우일 때 사용
나머지 중요한 점은 발생한 문제에서 ..
오랜만에 실행 안되는 부분을 찾느라 재밌었다.
물론 왜 안되는지 머리를 골리는 것은 한시간 안으로만 재밌다.. 그 이상 가면
항상 피폐해졌던 경험이..
'개발일지 > 스파르타 코딩클럽 유니티 강의' 카테고리의 다른 글
9일차 풍선 애니메이션 전환하기 ( Invoke , Has Exit Time ) (0) 2024.03.29 8일차 최고점수 보여주기 (0) 2024.03.28 6일차 풍선 & 마우스 만들기 (0) 2024.03.26 5일차 .. 2주차 시작 (0) 2024.03.25 4일차 점수 올라가게 하기 ~ 1주차 완료 (0) 2024.03.22