본문 바로가기

종스크롤 슈팅게임(1942)

9. 텍스트파일을 이용한 커스텀 배치 구현

TXT파일로 적들이 편대를 이뤄 날아오도록 구현해보겠습니다.

바탕화면에 TXT파일을 하나 생성해주고, 유니티 프로젝트에도 빈 폴더를 하나 생성해, 그곳에 드래그 앤드랍으로 넣어줍니다.

TXT 파일 생성

위 Stage0을 더블클릭하면 VS가 열리는데, 여기서 txt 파일을 수정하여 인게임에 적용시킬 수 있습니다.

txt 내용은 아래 형식처럼 스폰딜레이 시간, 적 타입, 스폰 포지션 순이며 커서가 마지막 줄 바로 오른쪽에 있도록 합니다. 

TXT 파일 수정

그리고 Spawn 스크립트를 하나 만들어주고 아래 코드를 입력합니다.

public class Spawn //MonoBehaviour 상속 불필요!
{
    public float delay; //스폰 딜레이
    public string type; //적 타입
    public int point; // 스폰 포지션
}

 

GameManager 스크립트에 코드를 추가합니다.

    using System.IO; //파일 입출력 처리

    //File
    public List<Spawn> spawnList;
    public int spawnIndex;
    public bool spawnEnd;
    
        void Awake()
    {
        spawnList = new List<Spawn>(); //리스트 초기화
        enemyObjs = new string[] { "EnemyS", "EnemyM", "EnemyL"};
        readSpawnFile(); //파일 초기화 함수 호출
    }
    
        void readSpawnFile() {
        //변수 초기화
        spawnList.Clear();
        spawnIndex = 0;
        spawnEnd = false;
        //리스폰 파일 읽기
        TextAsset textFile = Resources.Load("Stage0") 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 spawnEnemy() {
        //Enemy Spawn
        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;

        //int ranEnemy = Random.Range(0, 3);
        //int ranPoint = Random.Range(0, 9);
        GameObject enemy = objectManager.makeObj(enemyObjs[enemyIndex]);
        //Instantiate(enemyObjs[ranEnemy], spawnPoint[ranPoint].position, spawnPoint[ranPoint].rotation);
        enemy.transform.position = spawnPoint[enemyPoint].position;    
		...

        // 리스폰 인덱스 증가
        spawnIndex++;
        if (spawnIndex == spawnList.Count) {
            spawnEnd = true;
            return;
        }
        //다음 리스폰 딜레이 갱신
        nextSpawnDelay = spawnList[spawnIndex].delay;
    }

 

결과