[Unity] 종 스크롤 슈팅 게임 (스테이지)

펑크린·2021년 9월 16일

Unity

목록 보기
12/13

출처: 골드 메탈 님의 유튜브 콘텐츠 클론 코딩

00. 목차

  1. 커스텀 배치
  2. 텍스트 파일을 이용
  3. 결과

01. 커스텀 배치

  • 기존에는 랜덤한 위치에 적이 스폰되도록 하였다. 이를 제작자가 원하는 위치에 적이 생성될 수 있도록 한다.

  • 구조체를 하나 만들어서 활용한다. 구조체를 타입으로 하는 리스트를 만들어 생성 위치와 시점 그리고 적의 타입을 관리한다.

  • 스폰 시점, 타입, 스폰 위치를 ,를 기준으로 구분한다.

  • 프로젝트 내에 Resources 폴더를 생성하여 텍스트 파일을 저장한다.

02. 텍스트 파일

  • 텍스트 파일의 텍스트를 한줄 한줄 읽어 들여 ,를 기준으로 구분한다.
  • 위에서 만든 구조체에 구분된 데이터를 각각 저장하여 구조체를 완성하고 구조체들을 리스트로 관리한다.
  • 이제 spawn 메소드에서는 랜덤으로 적의 타입과 위치를 정하지 않고 리스트에 저장된 구조체를 차례대로 읽어 해당 위치에 적을 소환하도록 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    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;
 
            Debug.Log(line);
 
            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;
    }
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
    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;
 
        Rigidbody2D rigid = enemy.GetComponent<Rigidbody2D>();
        Enemy enemyLogic = enemy.GetComponent<Enemy>();
 
        enemyLogic.player = player;
        enemyLogic.gameManager = this;
        enemyLogic.objectManager = objectManager;
 
        if (enemyPoint == 5 || enemyPoint == 6)
        {
            enemy.transform.Rotate(Vector3.forward * 45);
            rigid.velocity = new Vector2(enemyLogic.speed, -1);
        }
        else if(enemyPoint == 7 || enemyPoint == 8)
        {
            enemy.transform.Rotate(Vector3.back * 45);
            rigid.velocity = new Vector2(enemyLogic.speed * (-1), -1);
        }
        else
        {
            rigid.velocity = new Vector2(0, enemyLogic.speed * (-1));
        }
 
        spawnIndex++;
        if(spawnIndex == spawnList.Count)
        {
            spawnEnd = true;
            return;
        }
 
        nextSpawnDelay = spawnList[spawnIndex].delay;
    }
cs

03. 결과

profile
코 익 인 간

0개의 댓글