🐧 들어가기 앞서

오늘은 새로운 팀을 구성했다!

팀장으로서 2주간 열심히 달려보자.


🐧 오늘 배운 것

  1. 코루틴

  2. 에러 처리


🐧 기억할 것 & 진행

코루틴(Coroutine)

  • 코루틴은 비동기적으로 실행되는 함수로, 특정 코드 블럭의 실행을 일시적으로 중지하고 다시 시작할 수 있게 해준다.

  • 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(); // 코루틴 멈춰라
    }

🐧 내일 할 일

남은 강의 완강하기!

0개의 댓글