GameDevelop/Unity팀프로젝트

[Unity 트러블슈팅] Wave/ZoneSpawner에서 Update 중복 호출로 인한 맵 클리어 문제 해결

도도돋치 2025. 7. 7. 17:26
Contents 접기
728x90

 

문제 상황

WaveSpawner와 ZoneSpawner가 동시에 Update를 돌리다 보니 맵 클리어가 여러 번 호출되는 현상이 발생했다.

 

증상
  • 웨이브를 클리어하면 MapManager.GoToNextMap()이 여러 번 실행됨
  • ZoneSpawner가 중간에 활성화되어버림
  • 맵이 두 번 비활성화되고 다음 맵으로 넘어감
  • 적이 스폰되기도 전에 클리어 처리됨

 

원인분석

문제를 추적해본 결과

  1. Update()에서 aliveChecker.AreAllDead()를 매 프레임 체크 중
  2. 웨이브나 존을 클리어해도 Update()가 계속 돌고 있었음
  3. 따라서 OnAllWavesCleared() 혹은 OnAllZonesCleared()가 여러 번 연속 실행

이 때문에 로그에 이렇게 찍혔다.

👆 중복 비활성화 및 중복 클리어
 

 

 

로그 해석

  1. Zone 1이 활성화됨
  2. Zone 1 적이 스폰됨 (1마리)
  3. [디버그] activeSelf=True (즉, 오브젝트는 활성화됨)
  4. 바로 다음 프레임 Update()에서 AreAllDead=False (정상)
    ✅ 여기까지는 예상한 흐름이었다

근데 바로 1초 뒤에

[17:46:59] 모든 맵 클리어!

이게 떴다.

 

로그를 보면 추가적인 "모든 Zone 클리어!" 로그가 아예 없고 바로 "모든 맵 클리어!"가 뜬다.


이건 Zone이 아닌 다른 코드에서 GoToNextMap()을 호출했다는 뜻이다.

 

 

최종 원인 분석

맵은 wave맵과 zone맵 2개로 나누어져 있는데 이전에 클리어한 wave맵의 WaveSpawner 코드가 같이 켜져있어서 OnAllWavesCleared()에서 GoToNextMap() 호출하는 것 같았다.


실제 로그에도 웨이브 관련 메시지가 바로 직전에 있었다.

  • Zone 맵을 하고 있다고 생각했는데
  • WaveSpawner도 활성화된 상태라 같이 체크하고 있었다

 

 

해결 방법

핵심은 단순했다


 Update()를 켜고 끄자.

  • 웨이브나 존 시작 시 this.enabled = true
  • 클리어 시 this.enabled = false 로 Update 정지

이렇게 하면 클리어 처리 후 중복 호출이 발생하지 않는다

 

 

 

적용 코드

아래는 WaveSpawner 예시이다.

public void StartWave()
{
    triggered = true;
    this.enabled = true; // Update 켜기
    SpawnWave(currentWaveIndex);
}

private void OnAllWavesCleared()
{
    Debug.Log("웨이브 클리어!");
    this.enabled = false; // Update 끄기
    FindObjectOfType<MapManager>().GoToNextMap();
}

 

그리고 ZoneSpawner도 동일하게 처리했다.

public void StartZones()
{
    if (zones == null || zones.Length == 0)
    {
        Debug.LogWarning("[ZoneSpawner] Zones가 비어있음.");
        return;
    }

    triggered = true;
    this.enabled = true; // Update 켜기
    StartNextZone();
}

private void OnAllZonesCleared()
{
    Debug.Log("모든 Zone 클리어!");
    this.enabled = false; // Update 끄기
    FindObjectOfType<MapManager>().GoToNextMap();
}

 

 

주의할 점

  • this.enabled를 꺼두면 Update가 아예 멈추니, 반드시 시작할 때 켜줘야 함
  • triggered 같은 bool 플래그만으로는 안전하지 않을 수 있음
  • 맵 전환 로직과 충돌하지 않게 순서를 맞춰야 함

 

결과

이렇게 적용후에는

 

✅ 웨이브나 존 클리어 시 단 1회만 맵 전환이 호출
✅ 적이 모두 죽은 시점에만 정확히 넘어감
✅ ZoneSpawner와 WaveSpawner가 서로 간섭하지 않음

 

 

마무리

Unity에서 Update()는 유용하지만, 동시에 실수하기 쉽고 디버깅이 어려운 부분
이 사례처럼, 조건과 Update 활성화 상태를 분리 관리하는 습관이 중요하다는 걸 다시 한 번 느꼈다.

 

궁금한 점 있으면 댓글 주세요 😊

728x90