Unity - 2D 종스크롤 슈팅 : 텍스트 파일을 이용한 커스텀 배치 구현

TXMAY·2023년 10월 10일
0

Unity 튜토리얼

목록 보기
29/33
post-thumbnail

이번 강좌는 텍스트 파일을 이용한 커스텀 배치 구현에 관한 강좌다.


구조체

'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);
            ...
            
        }
		...
    }
    ...
    
}
  • StringReader : 파일 내 문자열 데이터 읽기 클래스
  • ReadLine() : 텍스트 데이터를 한 줄씩 반환. (자동 줄 바꿈)
  • Split(구분 문자) : 지정한 구분 문자로 문자열을 나누는 함수

데이터 적용

데이터를 적용하기 위해 다음과 같이 코드를 수정하고 추가한다.

...

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 파일로 비슷한 걸 구현해 봐서 익숙했다.

profile
게임 개발 공부하는 고양이

0개의 댓글