이번 강좌는 텍스트 파일을 이용한 커스텀 배치 구현에 관한 강좌다.
'Spawn.cs' 파일을 생성한 후, 다음과 같이 코드를 작성한다.
public class Spawn
{
public float delay;
public string type;
public int point;
}
'Stage.txt' 파일을 생성한 후, 다음과 같이 내용을 작성한다.
// delay, type, point
1,S,1
0.2,S,1
0.2,S,1
0.2,S,1
0.2,S,1
1,S,3
0.2,S,3
0.2,S,3
0.2,S,3
0.2,S,3
2,M,2
그리고 Resources 폴더를 생성한 후, 그 폴더에 txt 파일을 넣는다.
Resources : 런타임에서 불러오는 에셋이 저장된 폴더
그런 다음 'GameManager.cs' 파일에 다음과 같이 코드를 추가한다.
...
using System.IO;
public class GameManager : MonoBehaviour
{
...
public List<Spawn> spawnList;
public int spawnIndex;
public bool spawnEnd;
void Awake()
{
spawnList = new List<Spawn>();
...
ReadSpawnFile();
}
void ReadSpawnFile()
{
spawnList.Clear();
spawnIndex = 0;
spawnEnd = false;
TextAsset textFile = Resources.Load("Stage 0") as TextAsset;
StringReader stringReader = new StringReader(textFile.text);
while (stringReader != null)
{
string line = stringReader.ReadLine();
if (line == null)
{
break;
}
Spawn spawnData = new Spawn();
spawnData.delay = float.Parse(line.Split(',')[0]);
spawnData.type = line.Split(',')[1];
spawnData.point = int.Parse(line.Split(',')[2]);
spawnList.Add(spawnData);
}
stringReader.Close();
nextSpawnDelay = spawnList[0].delay;
}
void Update()
{
...
if (curSpawnDelay > nextSpawnDelay)
{
...
nextSpawnDelay = Random.Range(0.5f, 3f);
...
}
...
}
...
}
데이터를 적용하기 위해 다음과 같이 코드를 수정하고 추가한다.
...
void Update()
{
...
if (curSpawnDelay > nextSpawnDelay && !spawnEnd)
{
SpawnEnemy();
curSpawnDelay = 0;
}
...
}
void SpawnEnemy()
{
int enemyIndex = 0;
switch (spawnList[spawnIndex].type)
{
case "S":
enemyIndex = 0;
break;
case "M":
enemyIndex = 1;
break;
case "L":
enemyIndex = 2;
break;
}
int enemyPoint = spawnList[spawnIndex].point;
GameObject enemy = objectManager.MakeObj(enemyObjs[enemyIndex]);
enemy.transform.position = spawnPoints[enemyPoint].position;
...
spawnIndex++;
if (spawnIndex == spawnList.Count)
{
spawnEnd = true;
return;
}
nextSpawnDelay = spawnList[spawnIndex].delay;
}
...
텍스트 파일만 수정하면 원하는 적 출현 구현이 가능하다.
예전에 GMS2에서 json 파일로 비슷한 걸 구현해 봐서 익숙했다.