데이터로 표현한 웨이브
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 에셋을 할당하면 되며, 스크립트는 그대로 유지됩니다.
챌린지
중급블록 비: 블록이 리듬에 맞춰 하늘에서 떨어지고, 화살표 키로 피합니다. 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 (에셋)은 여기에 넣습니다
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.