오늘은 새로운 팀을 구성했다!
팀장으로서 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(); // 코루틴 멈춰라
}
남은 강의 완강하기!