Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공hannah부

CJ UNIT 7기 게임TF #11(급식실 게임 - 다시시작) 본문

프로젝트/CJ UNIT 7기 게임TF

CJ UNIT 7기 게임TF #11(급식실 게임 - 다시시작)

Hannah0226 2022. 11. 30. 05:29
오늘의 내용

- 게임이 끝나면 다시 할 수 있는 다시시작 버튼을 만들고 기능을 구현해보자(+게임초기화)

- 버튼이 안눌릴 때 해결 방법

 

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 체크를 해제해주기이다!! 이것때문에 몇시간을 날린 건지 모르겠지만 해결되어서 다행이고 뿌듯하다...ㅎ...

 

실행영상