(41) 오류 수정 + 게임 전체 플레이
이제 정말 끝이 보인다. 직전 글에서 마무리로 오류수정을 하고 게임을 전체적으로 플레이하겠다고 했는데
오늘은 이것을 마지막으로 마무리 해보려고 한다.
우선 첫번째 오류부터 해결해보자. 1~6번 스테이지는 아직 아이템 생성이 되선 안된다
하지만 지금은 1번 스테이지에서도 첫번째 아이템이 랜덤 생성되는것을 확인할 수 있다
private void SetMaxIndex()
{
float stageID = stageGameManager.StageClearID;
if (stageID <= 6)
{
CancelInvoke("SpawnSphere"); // StageClearID가 6 이하일 때는 스폰을 중지
}
else if (stageID <= 10)
{
maxIndex = 0;
}
else if (stageID <= 17)
{
maxIndex = 1;
}
랜덤 생성을 담당하는 코드를 보자. stageID가 6보다 작거나 같다면 CancelInvoke로 스폰을 중지하도록 하였다
if (stageID <= 6)
{
CancelInvoke("SpawnSphere"); // StageClearID가 6 이하일 때는 스폰을 중지
}
if (stageID <= 6)
{
maxIndex = -1;
}
굳이 CancelInvoke를 건드려주기 보다는 정말 단순하게 배열에서 어떠한 값도 꺼내오지 못하도록
maxIndex값을 -1로 잡아주었다. 이러니까 원하는대로 아이템 생성이 안되는것을 확인할 수 있었다
그 다음은 두번째 오류. Twice 아이템으로 적을 제거할때 제거판정이 두번 되어
아직 모든 적들을 제거하지 않았는데 게임 승리 판정이 날때가 있다. 수정해주자
private void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.tag == "EnemyBall") return;
if (coll.gameObject.tag == "Gojung") return;
if (coll.gameObject.name != SPEndlessFName)
{
TakeDamage(1);
}
if (coll.gameObject.name == SPTwiceFName)
{
TakeDamage(1);
}
}
이유는 얼추 알것같다. 적 유닛이 데미지를 입는 TakeDamage의 구조 때문. 내구도가 0과 같거나 작아지는 순간
spgamemanager.RemoveBall()을 실행하니 데미지가 동시에 두번 들어가면 RemoveBall도 두번이 실행되는것
private void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.tag == "EnemyBall") return;
if (coll.gameObject.tag == "Gojung") return;
if (coll.gameObject.name != SPEndlessFName && coll.gameObject.name == SPTwiceFName)
{
TakeDamage(1);
}
if (coll.gameObject.name == SPTwiceFName)
{
TakeDamage(2);
}
}
그래서 보기엔 조금 번거롭지만 코드를 변경해주었다.
이제 데미지 1을 두번주는게 아니라 처음부터 데미지 2를 주면서 오류가 수정되었다
마지막 오류인 최종보스 유닛추가 부분.
최종보스가 가장 어려운 이유중 하나인 스킬인 적 유닛 추가는 일정 시간마다 랜덤한 적 유닛 4개를 상하좌우로 소환한다
하지만 이 게임의 시스템은 게임이 처음 시작할때 적 유닛의 수를 파악하여 totalenemy에 추가한뒤
적 유닛을 하나씩 제거할때마다 totalenemy의 수를 1씩 빼준다.
하지만 마지막 스테이지는 최종보스 하나로 시작하니 totalenemy는 당연히 1. 그 상태에서 중간에 소환한
다른 적 유닛을 제거해주면 게임이 승리판정으로 끝나버리고 만다. 이걸 수정해줘야 한다