Menu
CoddyTech

데이터로 표현한 웨이브

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

레벨의 웨이브는 목록입니다. 그런트 3마리, 그다음 브루트 2마리, 그다음 보스입니다. 스포너의 코드로 작성하면 각 레벨마다 고유한 코드가 필요합니다. 데이터로 작성하면 목록이 에셋에 들어가므로 레벨마다 에셋 하나씩 만들고, 스포너 스크립트 하나가 전달받은 에셋을 읽습니다. 각 항목은 [System.Serializable] 클래스이므로 에셋의 Inspector에 목록이 표시됩니다.

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 에셋을 선택하면 Inspector에 Waves와 Size, 그리고 각 행의 Element 0, Element 1이 표시되며, 각 항목에는 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는 lanes 배열의 각 레인에 블록을 떨어뜨리며, 항상 1초 간격을 둡니다. 리듬을 데이터로 만들어 모든 곡을 에셋으로 사용할 수 있게 하세요.

  • DropPattern.cs에서 공개 필드 lane(int: -1은 왼쪽, 0은 가운데, 1은 오른쪽)와 delay(float: 블록을 떨어뜨리기 전에 기다릴 시간(초))가 있는 [System.Serializable] 클래스 Drop을 작성하세요. 그 아래에 [CreateAssetMenu]와 공개 필드 blockPrefab(GameObject), laneWidth(float), drops(List<Drop>)가 있는 ScriptableObject인 DropPattern을 작성하세요.
  • Dropper에서 두 필드를 모두 제거하고, DropPattern 타입의 공개 필드 pattern으로 바꾸세요. 각 드롭을 순서대로 처리하며 delay만큼 기다린 다음, Dropper의 위치에서 x축 방향으로 lane에 laneWidth를 곱한 만큼 이동한 곳에 패턴의 블록을 떨어뜨리세요. 마지막 드롭이 끝나면 Pattern done을 로그에 출력하세요.

프로젝트에는 레인 너비가 2이고 드롭이 네 번 있는 Song1 에셋이 있습니다. Inspector에서 이 에셋을 Dropper의 pattern 필드에 넣습니다. Play를 눌러 피한 다음 Check를 누르세요.

직접 해보기

using System.Collections.Generic;
using UnityEngine;

// Drop (블록 하나: 해당 레인과 그 전에 대기하는 시간)와 DropPattern (에셋)은 여기에 넣습니다
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

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