엄청 오랜만에 포스팅
몬스터를 Spawn하는 코루틴을 이용하다가
Time.timeScale을 건드리지 않고 Spawn을 멈춰야 될 상황이 생겼다.
IEnumerator SpawnEnemy()
{
while(enemyCount < 10)
{
Instantiate(~);
enemyCount++;
yield return new WaitForSeconds(2f);
}
}
코루틴은 이렇게 생겼었다
바로 드는 생각은
StopCoroutine("EnemySpawn");
요거여서 그대로 했는데 Spawn이 잘 멈췄다.
그러고 다시
StartCoroutine("SpawnEnemy");
실행!
하지만 문제가 하나 생겼는데
2초마다 일정 간격으로 줄지어서 이쁘게 나오던 몬스터들이 Spawn이 정지됐다가 재개되는 그 사이에 간격이 흐트러지는 것이다.
StopCoroutine다음 StartCoroutine을 할 때 엔진딴에서 interrupt 될때의 시점을 따로 가지고 있는줄 알았는데
그냥 처음 StartCoroutine을 할 때의 entrypoint로 가버린다.
구글링 하다가 딱히 방도가 없어서
다음과 같은 방식으로 나 혼자 해결했다
float? lastSpawnTime = null;
float? interruptedTime = null;
bool isStoppedSpawnEnemy = false;
void StopSpawnEnemy()
{
isStoppedSpawnEnemy = true;
interruptedTime = Time.time;
}
IEnumerator SpawnEnemy()
{
while(enemyCount < 10)
{
if(isStoppedSpawnEnemy)
yield return new WaitUntil(() => isStoppedSpawnEnemy == false);
if(interruptedTime != null)
{
yield return new WaitForSeconds(2f - (interruptedTime.Value - lastSpawnTime.Value));
interruptedTime = null;
}
Instantiate(~);
enemyCount++;
lastSpawnTime = Time.time;
yield return new WaitForSeconds(2f);
}
}
이렇게 StopCoroutine이 아니라 코루틴 자체에 Suspend를 걸어
멈춘 시간 차이만큼 좀 기다렸다가 다시 Spawn이 재개되게끔 할 수 있다.
'etc > Unity' 카테고리의 다른 글
[Unity] UI 크기를 WorldSpace 기준으로 바꾸기 (0) | 2022.02.25 |
---|---|
[Unity] VS에서 Unity 메세지 띄우는 법 (0) | 2021.07.12 |
[Unity] 코루틴, Coroutine이란? (0) | 2021.07.12 |