오늘은 새로운 팀을 구성했다!
팀장으로서 2주간 열심히 달려보자.
코루틴
에러 처리
코루틴은 비동기적으로 실행되는 함수로, 특정 코드 블럭의 실행을 일시적으로 중지하고 다시 시작할 수 있게 해준다.
IEnumerator 리턴 타입의 함수에서 yield return을 사용하여 코루틴을 구현할 수 있다.
StartCoroutine 함수를 통해 코루틴을 시작할 수 있고, StopCoroutine 함수를 통해 코루틴을 중지할 수 있다.
코루틴은 프레임 간의 지연, 비동기 작업, 시간에 따른 애니메이션 등의 작업에 주로 사용된다.
yield return null은 다음 프레임까지 대기를 의미하고, yield return new WaitForSeconds(n)은 n초 동안 대기를 의미한다.
코루틴은 별도의 스레드에서 실행되지 않는다. 따라서 Unity의 메인 스레드에서 안전하게 Unity API를 호출할 수 있다.
코루틴은 일반 함수와는 다르게, 실행을 일시 중단하고 나중에 다시 시작할 수 있어, 시간 지연, 반복, 조건부 대기 등의 작업을 수행할 때 매우 유용하다.


게임을 만들다 보면, 정말 오타가 많이 날 수 있다.
코드를 한번 더 점검하고, Unity에서 설정하는 모든 것들을 한번 더 점검해보자!
private void Start()
{
StartCoroutine("StartNextWave"); // 코루틴 실행
}
IEnumerator StartNextWave() // 코루틴 비 동기적으로 실행. 코드를 일시적으로 정지하거나 재생하는 기능 가능.
{
// 안전하게 비동기 코드 제작 가능
while (true) // 무한루프, = Update
{
if(currentSpawnCount == 0) // 첫 시작 or 다 잡았거나
{
UpdateWaveUI();
yield return new WaitForSeconds(2f); // 2초 뒤 다음 코드 동작
if(currentWaveIndex % 10 == 0) // 스테이지가 10의 배수라면, 스폰 포지션 늘림
{
waveSpawnPosCount = waveSpawnPosCount + 1 > spawnPositions.Count ? waveSpawnPosCount : waveSpawnPosCount + 1;
waveSpawnCount = 0;
}
if(currentWaveIndex % 5 == 0)
{
}
if(currentWaveIndex % 3 == 0) // 3의 배수라면, 스폰을 늘림
{
waveSpawnCount += 1;
}
for(int i = 0; i < waveSpawnPosCount; i++)
{
int posIdx = Random.Range(0, spawnPositions.Count);
for(int j = 0; j < waveSpawnCount; j++)
{
int prefabIdx = Random.Range(0, enemyPrefabs.Count);
GameObject enemy = Instantiate(enemyPrefabs[prefabIdx], spawnPositions[posIdx].position, Quaternion.identity);
enemy.GetComponent<HealthSystem>().OnDeath += OnEnemyDeath;
currentSpawnCount++;
yield return new WaitForSeconds(spawnInterval);
}
}
currentWaveIndex++;
}
yield return null;
}
}
private void GameOver()
{
gameOverUI.SetActive(true);
StopAllCoroutines(); // 코루틴 멈춰라
}
남은 강의 완강하기!