Menu
CoddyTech

데이터로 표현한 웨이브

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

레벨의 웨이브는 목록입니다. 잡졸 3마리, 그다음 강적 2마리, 마지막으로 보스입니다. 스포너의 코드로 작성하면 레벨마다 각기 다른 코드가 필요합니다. 데이터로 작성하면 목록이 에셋에 들어가므로 레벨마다 에셋 하나씩 만들고, 스포너 스크립트 하나가 전달받은 에셋을 읽습니다. 각 항목은 [System.Serializable] 클래스이므로 에셋의 인스펙터에 목록이 표시됩니다:

using System.Collections.Generic;
using UnityEngine;

[System.Serializable]
public class Wave
{
    public GameObject enemy;
    public int count = 1;
    public float spacing = 1f;
}

[CreateAssetMenu(menuName = "Game/Wave Set")]
public class WaveSet : ScriptableObject
{
    public List<Wave> waves;
    public float restBetweenWaves = 3f;
}

이 코드는 모두 WaveSet.cs라는 파일 하나에 들어갑니다. ScriptableObject는 클래스 이름과 같은 파일이 필요하며, 일반 Wave 클래스는 그 옆에 둘 수 있습니다. WaveSet 에셋을 선택하면 인스펙터에 Size와 각 행의 Element 0, Element 1이 있는 Waves가 표시되며, 각 항목에는 Enemy, Count, Spacing이 있습니다. + 버튼을 누르면 웨이브가 추가됩니다. 스포너는 코루틴에서 목록을 순회합니다:

public class WaveSpawner : MonoBehaviour
{
    public WaveSet waveSet;

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

    IEnumerator SendWaves()
    {
        foreach (Wave wave in waveSet.waves)
        {
            for (int i = 0; i < wave.count; i++)
            {
                Instantiate(wave.enemy, transform.position, Quaternion.identity);
                yield return new WaitForSeconds(wave.spacing);
            }
            yield return new WaitForSeconds(waveSet.restBetweenWaves);
        }
        Debug.Log("Last wave sent");
    }
}

Level1에 0.5초 간격의 잡졸 3마리와 그다음 강적 2마리를 설정하면, 잡졸은 0초, 0.5초, 1초에 등장하고 마지막 잡졸 이후의 간격과 3초의 휴식 시간이 이어진 다음 첫 번째 강적이 4.5초에 등장합니다. Level 2의 스포너에는 더 어려운 웨이브가 설정된 Level2 에셋을 할당하며, 스크립트는 그대로 유지됩니다.

challenge icon

챌린지

중급

Dropper의 리듬을 노래 에셋으로 바꾸세요.

  1. DropPattern.cs에서 [System.Serializable] 클래스 Drop를 작성하고, public int lane과 float delay를 추가하세요.
  2. 그 아래에 [CreateAssetMenu]가 있는 DropPattern : ScriptableObject를 작성하고, public GameObject blockPrefab, float laneWidth, List<Drop> drops를 추가하세요.
  3. Dropper에서 public DropPattern pattern;을 사용하세요. 각 드롭마다 drop.delay만큼 기다린 다음, x축을 따라 drop.lane * pattern.laneWidth만큼 이동한 위치에 블록을 떨어뜨리세요.

‘플레이’를 누르세요. 블록 네 개가 떨어집니다. 그런 다음 ‘확인’을 누르세요.

직접 해보기

using System.Collections.Generic;
using UnityEngine;

// Drop (블록 하나: 해당 블록의 레인과 그 전에 대기하는 시간)과 DropPattern (에셋)을 여기에 정의합니다

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

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