공hannah부
CJ UNIT 7기 게임TF #11(급식실 게임 - 다시시작) 본문
오늘의 내용
- 게임이 끝나면 다시 할 수 있는 다시시작 버튼을 만들고 기능을 구현해보자(+게임초기화)
- 버튼이 안눌릴 때 해결 방법
GameManager
- 다른 스크립트에서도 쉽게 가져와 쓸 수 있도록 static instance를 해준다.
- 게임이 끝났는지 안끝났는지 알 수 있도록 isStartGame 변수를 만들어준다.
public static GameManager instance;
public bool isStartGame = false;
- GameStart 함수를 만들어 준다.
→ 학생, 점수, 콤보 등의 정보들 초기화
→ isStartGame = true로 바꿔주기
public void GameStart()
{
theNote.Initialized();
theCombo.ResetCombo();
theScore.Initialized();
theEffect.Initialized();
isStartGame = true;
}
Result
- 다시시작 버튼을 누르면 결과창을 false로 바꿔 없애고 GameManager 스크립트의 GameStart 함수를 실행시킨다.
public void ButtonRestart()
{
goUI.SetActive(false);
GameClear.SetActive(false);
GameOver.SetActive(false);
GameManager.instance.GameStart();
}
StartBGM
- 노래가 끝나면 isStartGame = false로 바꿔준다
//StartBGM Update()
if(musicStart)
{
if (myAudio.isPlaying)
{
}
else
{
theResult.ShowResult();
GameManager.instance.isStartGame = false;
musicStart = false;
}
}
NoteManager
- isStartGame 이 true일 때 학생을 생성하도록 조건을 넣어준다.
- 원래 BGM은 StartBGM 스크립트에서 재생했는데 isStartGame이 true일 때 학생 생성과 같이 관리해 주기 위해 isStartGame이 true이고 StudentNum == 0 일 때 노래를 재생시켜주도록 한다.
//NoteManager Update()
if(GameManager.instance.isStartGame)
{
if(StudentNum == 0)
theStartBGM.Invoke("MusicStart",1);
if(StudentNum <= 83)
{
currentTime += Time.deltaTime;
if(currentTime >= 140d/bpm)
{
if(StudentNum >= 3)
{
spawn_obj = Random.Range(1,3);
if(spawn_obj == 1) //랜덤수가 1이라면 식판 든 학생 생성
{
GameObject StudentO = ObjectPool.instance.StudentOQueue.Dequeue();
StudentO.transform.localPosition = tfNoteAppear;
StudentO.SetActive(true);
}
else //랜덤수가 2라면 식판 들지 않은 학생 생성
{
GameObject StudentX = ObjectPool.instance.StudentXQueue.Dequeue();
StudentX.transform.localPosition = tfNoteAppear;
StudentX.SetActive(true);
}
}
currentTime -= 140d / bpm;
StudentNum++;
}
}
}
초기화
- 학생 수, 시간, 랜덤 값 초기화 함수
**처음에는 학생 수 만 초기화 해주었는데 계속 다시시작을 할 때마다 학생 생성 시작 타이밍이 빨라지는 오류가 있었다. → 값이 계속 변하는 다른 변수들도(특히 currentTime) 초기화해 주니 해결!
//NoteManager
public void Initialized()
{
StudentNum = 0;
currentTime = 0d;
spawn_obj=0;
}
- 점수 초기화 함수
//ScoreManager
public void Initialized()
{
currentScore = 0;
txtScore.text = "0";
}
- perfect, cool, good, bad, miss 횟수 값 초기화 함수
//EffectManager
public void Initialized()
{
judgementRecord[0] = 0;
judgementRecord[1] = 0;
judgementRecord[2] = 0;
judgementRecord[3] = 0;
judgementRecord[4] = 0;
}
- 이 함수들은 모두 GameStart 함수에서 불러와 사용한다 (위 GameManager 참조)
버튼이 안눌릴 때
코드를 짜고 테스트를 해보려는데 버튼이 계속 안눌려 다시시작이 실행되지 않았다. 그래서 열심히 해결 방법을 찾아보니
- EventSystem이 있는지 확인하기 없다면 넣기
- 버튼 위를 다른 오브젝트가 가리고 있는지 확인하기 있다면 없애기 / 없앨 수 없는 오브젝트라면 Raycast Target 체크 해제해주기
- 해당 버튼에 Canvas Group 컴포넌트를 추가해 Interactable, Blocks Raycast가 체크되어 있는지 확인하기
등등이 있었다.
그래서 이들을 모두 확인해보았지만 모두 정상이었다... 테스트파일을 만들어 테스트를 해본 결과 이유를 알 수 있었는데 해당 버튼에 Canvas컴포넌트를 추가해 눌리지 않았던 것이었다.(왜 Canvas를 추가하면 클릭이 안되는건진 여전히 모르겠다..) 이유는 어찌어찌 알았다만 나는 요소들의 Layer가 중요했기에 Canvas 컴포넌트를 지울 순 없었다.. 그래서 다시 열심히 구글링을 하다 겨우 해결방법을 찾았다!
해당 버튼에 Graphic Raycaster 컴포넌트를 추가한 후 Ignore Reversed Graphics 체크를 해제해주기이다!! 이것때문에 몇시간을 날린 건지 모르겠지만 해결되어서 다행이고 뿌듯하다...ㅎ...
실행영상
'프로젝트 > CJ UNIT 7기 게임TF' 카테고리의 다른 글
CJ UNIT 7기 게임TF #13(급식실 게임 - 효과음) (0) | 2022.12.13 |
---|---|
CJ UNIT 7기 게임TF #12(급식실 게임 - 튜토리얼) (0) | 2022.12.13 |
CJ UNIT 7기 게임TF #10(급식실 게임 - 오브젝트 풀링) (0) | 2022.11.29 |
CJ UNIT 7기 게임TF #9(급식실 게임 - 자잘한 수정) (0) | 2022.11.28 |
CJ UNIT 7기 게임TF #8(급식실 게임 - 게임 클리어 / 오버 구분) (0) | 2022.11.27 |