Menu
CoddyTech

아레나를 정리하라

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 64개 중 55번째.

static으로 표시된 이벤트는 객체 하나가 아니라 클래스에 속합니다. 앞으로 존재할 모든 적을 통틀어 Enemy.Died는 하나뿐이므로, 스포너는 적이 하나도 없을 때 Enemy.Died += OnEnemyDied;로 구독할 수 있으며, 각 적은 자기 자신을 인수로 전달해 해당 이벤트를 발생시킵니다. 일반 C#에서 같은 개념을 살펴보겠습니다.

public class Coin
{
    public static event Action<Coin> Picked;

    public void Pick()
    {
        Picked?.Invoke(this);
    }
}

public class Purse
{
    private int coins;

    public Purse()
    {
        Coin.Picked += OnPicked;   // 아직 Coin은 필요하지 않음
    }

    void OnPicked(Coin coin)
    {
        coins++;
    }
}

인스턴스 이벤트는 hero.Died처럼 객체를 통해 접근하고, 정적 이벤트는 Coin.Picked처럼 클래스 이름을 통해 접근합니다. 정적 이벤트는 모든 객체가 사라진 뒤에도 유지되므로, OnDisable에서 구독을 해제해야 합니다. 그렇지 않으면 파괴된 스포너가 목록에 계속 남습니다.

challenge icon

챌린지

중급

각 웨이브는 아레나가 비워질 때까지 기다리게 하세요.

  1. Enemy에 public static event Action<Enemy> Died;를 추가하고, Destroy(gameObject); 바로 앞에서 Died?.Invoke(this);를 호출하세요.
  2. WaveSpawner에서 alive를 세세요. 적을 생성할 때마다 1을 더하고, OnEnable에서 Enemy.Died에 등록하고 OnDisable에서 등록을 해제하는 메서드에서 1을 빼세요.
  3. 웨이브의 적을 생성한 뒤, alive > 0인 동안 기다리세요.

‘플레이’를 누르고 1웨이브를 물리치세요. 2초 후에 2웨이브가 시작됩니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using System.Collections;
using UnityEngine;

public class WaveSpawner : MonoBehaviour
{
    [SerializeField] private WaveSet waveSet;
    [SerializeField] private Transform[] spawnPoints;

    public int Wave { get; private set; }

    void Start()
    {
        StartCoroutine(RunWaves());
    }

    IEnumerator RunWaves()
    {
        while (true)
        {
            foreach (Wave wave in waveSet.waves)
            {
                Wave++;
                Debug.Log("Wave " + Wave);
                for (int i = 0; i < wave.count; i++)
                {
                    Transform point = spawnPoints[i % spawnPoints.Length];
                    Instantiate(wave.enemy, point.position, Quaternion.identity);
                    yield return new WaitForSeconds(wave.spacing);
                }
                yield return new WaitForSeconds(waveSet.restBetweenWaves);
            }
        }
    }
}

Unity 게임 아키텍처의 모든 레슨

직접 연습해 보세요: Unity 플레이그라운드