상세 컨텐츠

본문 제목

Unity_기초_드래곤플라이트 비슷한 게임 만들기_적 무한 생성

Unity_기초

by 위한신 2024. 5. 1. 19:05

본문

 

 

새로운 메소드를 만들자.

 

IEnumerator EnemyRoutine() {

 

이 아래에 foreach 로 만들었던 코드를 가져오면, 

 

IEnumerator EnemyRoutine() {
       yield return new WaitForSeconds(3f);
        foreach(float posX in arrPoX) {
        int index = Random.Range(0,enemies.Length);
        SpawnEnemy(posX,index);
        }
     }

 

yield return new WaitForSeconds(3f); 

일단 따라하자.

 

void Start()
    {
        startEnemyRoutine();
    }
    void startEnemyRoutine(){
        StartCoroutine("EnemyRoutine");
    }
     IEnumerator EnemyRoutine() {
       yield return new WaitForSeconds(3f);
        foreach(float posX in arrPoX) {
        int index = Random.Range(0,enemies.Length);
        SpawnEnemy(posX,index);
        }
     }
   

 

일단 천천히, 코드를 읽어보면

스타트 에너미 루틴이, 스타트 코 루틴이라는 명령어에 의해서 for문을 감싼 에너미 루틴을 가져오고 있고, 

그러한 스타트에너미 루틴을 스타트에서 한 번 실행한다. 

 

 에너미 스포너라는 객채를 만들어주면서 스타트 에너미 루틴이 호출, 에너미 루틴이라는 메소드의 동작이 불러진다.

일반적인 코드에서는 잠깐 기다리라는 명령을 처리 할 때에 그 동작이 끝나야만 다른 동작을 호출 할 수 있는데 

스타트 코 루틴이라는 명령어를 사용하면 그 사이에도 계속 동작을 이어나갈 수 있게 된다.  

 

이제 무한으로 적을 쏟아내기 위해서 무한 반복문이 필요하다.

무한 반복문은 while 을 통해서 불러올 수 있다.  그

 while(true)

 

 

 while(true) {
        foreach(float posX in arrPoX) {
        int index = Random.Range(0,enemies.Length);
        SpawnEnemy(posX,index);
        }
      }

 while  반복문으로 foreach 반복문을 감싸서 계속 실행해주고, 그 위에  

 

IEnumerator EnemyRoutine() {
       yield return new WaitForSeconds(3f);

3초의 텀을 두면, 

3초가 지난 뒤에 무한 반복문이 실행되는 것이다.

그리고 또 실행한 뒤에 3초가 지나면 반복문이 재생된다. 

하지만 한 번 실행 될 때 while 반복문이 무한으로 재생되는 문제가 생길 수 있다. 

 

그래서 다시 반복문 안에도 제한을 두면

 IEnumerator EnemyRoutine() {
       yield return new WaitForSeconds(3f);
       
        while(true) {
            foreach(float posX in arrPoX) {
                int index = Random.Range(0,enemies.Length);
                SpawnEnemy(posX,index);
         }

          yield return new WaitForSeconds(spawnInterval);

얼마가 적당한지 보기 위해서 '스폰 인터벌'은  유니티에서 컨트롤 할 수 있도록 해주자. 

 

 

그리고 코드를 저장한 뒤에 게임을 실행해보면,

무한으로 쏟아지는 쓰래기를 구경할 수 있다. 

 

 

아직 끝나지 않았다. 

쓰래기들 중에서도 강한 놈이 있고, 약한 놈이 있어야 게임이 성립할 텐데 말이다.

 

그래서 점점 강해지는 적들을 구현하기 위해서 

 

int spawncount = 0;
        int enemyindex = 0;

        while(true) {
            foreach(float posX in arrPoX) {
                int index = Random.Range(0,enemies.Length);
                SpawnEnemy(posX,enemyindex);
         }
        spawncount += 1;
         if (spawncount % 10 == 0) {

         }

 

스폰 카운트와 에너미 인덱스의 값을 따로 정의해주고

에너미 인덱스의 값을 따라서 쓰래기들의 종류가 정해지도록 바꾸자.

 

그 뒤에 반복문이 끝나면 스폰 카운트를 1 올리고, 

스폰 카운트를 10으로 나누었을때, 그 나머지가 0이 된다면 즉, 10의 배수마다 

if 문이 출력되도록 한 것이다. 

 

그리고 if 문 안에서 스폰 카운트를 1씩 올리는 작업을 진행해주면, 쓰래기의 종류가 10의 배수마다 바뀌어서 등장한다.

하지만 이러면, 카운트가 에너미 종류 이상으로 넘어갔을때, 더는 코드가 작동하지 않게 된다. 그래서

 

if(index >= enemies.Length) {
            index = enemies.Length -1;
          }

스폰 에너미의 값에서 index의 범위를 인덱스가 계속해서 1씩 줄어들도록 만들자. 

 

그런데 몹들이 계속 정해진 값으로만 나오면 재미가 없으니, 하나 이상의 적들이 사이 사이에 섞여 나오도록 바꾸면 

if(Random.Range(0,5) == 0)

0~4 사이의 랜덤 값을 뽑고, 그때 0을 뽑으면 20% 확률로 다음 인덱스의 적이 나타날 수 있도록

 

 index += 1;

를 뒤에 더해준다. 

 

그러면 더 강해진 적들이 사이 사이에 섞여서 점차 강해지는 적들을 볼 수 있다.  

 

 

근데  속도가 너무 일정하니 아무리 쓰래기들이 강해져도 별 재미가 없을 수 있다. 

쓰래기들의 종류에 따라서 그 속도를 좀 빠르게 바꿔보자

 

스크립트에서 스폰 카운트가 10씩 증가할 때마다 스피드를 조금씩 빠르게 하자.

 

그러기 위해서는  

 

SpawnEnemy(float posX, int index, float movespeed)

스폰 에너미 부분에서 불러오는 값에 무브 스피드를 추가해주고 

 

 foreach(float posX in arrPoX) {
                int index = Random.Range(0,enemies.Length);
                SpawnEnemy(posX,enemyindex, movespeed);
         }
        spawncount += 1;
         if (spawncount % 10 == 0) { // 10, 20, 30
            enemyindex += 1;
            movespeed += 2;

여기 안에 스폰 에너미로 불러오는 값에도 무브 스피드를 추가,

10바퀴가 지나면 2의 스피드가 오르도록 반복해주자. 

 

하지만 에너미의 속도는 에너미 스크립트 안에서 정의되고 있기 때문에 그것을 수정해줘야 한다. 

 

public void setmovespeed(float movespeed) {
        this.movespeed

    }

다른 스크립트에게도 영향을 줘야하기 때문에 퍼블릭으로 메소드를 만들자, setmovespeed 라는 값을 정의해주고

this.movespeed를 통해서 이미 에너미 위에 정의된 무브 스피드를 불러오고, 새롭게 불러올 movespeed 값을 그것과 동일하게 만들어준다.  동일한 이름으로 정의된 문장을 다르게 불러오기 위해서는 this 명령어를 사용하자. 

 

다시 정리하자면, 스폰 에너미를 하면서 무브 스피드 값을 전달 받음 

레벨이 올라갈 수록 점점 빨라지도록하기 위해서 

그것을 위해서 '에너미' 스크립트 안에서 무브 스피드라는 값을 재정의하고 동일하게 만듬

그 다음에 스포너로 돌아가서 

게임 오브젝트로부터 에너미라는 컴포넌트를 얻어와서 

에너미의 setmoveSpeed라는 값으로 우리의 무브 스피드를 설정하도록 한 것이다.

 GameObject enemyObject = Instantiate(enemies[index], spawnPos, Quaternion.identity);
           enemy enemy = enemyObject.GetComponent<enemy>();
           enemy. setmovespeed(movespeed);
       }

관련글 더보기