[타워디펜스게임] #10. 몬스터 생성 순서

치치·2025년 2월 15일
0

타워디펜스게임

목록 보기
10/18
post-thumbnail

오늘의 목표

기존의 몬스터가 랜덤 생성되던걸 조금 변경하였다.
https://velog.io/@yangju058/타워디펜스게임-2.-몬스터-이동-랜덤-위치-생성

원래는 몬스터의 종류가 1개 였지만, 이제 여러 종류의 몬스터를 정의해두었기 때문에 일정한 규칙을 가지고 생성되야한다.

-> 처음부터 보스 몬스터가 나오면 안되잖아요 그쵸?


계획 (Queue를 사용함)

자료구조 Queue를 사용하여 구현하였다.

MonsterSpawner 스크립트 일부

  1. Awake함수에 객체가 생성되기 전에 미리 셋팅해둔다
    -> 몬스터의 레벨 별로 1,2,3이 순서대로 큐에 삽입 (Enqueue)
    -> 큐에 삽입된 것은 게임오브젝트 타입인 몬스터 객체이다


  1. 큐에서 빼낸 객체(몬스터)가 일정한 주기로 하나씩 랜덤한 위치에 생성된다 (Dequeue)

실행 시 문제점

코드를 짜다가 해당 오류를 발견했다

  • 큐에서 하나씩 객체를 빼서 생성하는 코드인데, 큐가 다 비었을때도 계속 Dequeue 하려고 하니까 생긴 문제
    -> Queue의 카운트가 0이 아닐때만 빼게 해야함

문제 해결

  • monsterQueue.Count != 0 조건 추가


  1. Queue 자료구조는 FIFO 선입선출 구조이기 때문에, 낮은 레벨의 몬스터부터 빼서 생성할 수 있다

  2. 큐에 들어간 몬스터 객체들은 모두 본인의 정보가 저장된 스크립트를 가지고 있다
    -> 따라서, 몬스터 객체들이 각각 다른 스탯을 가지고 있는 것 (MonsterStat 스크립트)


MonsterSpawner 스크립트 전체 코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonsterSpawner : MonoBehaviour
{
    public Transform[] spawnPoints; // 스폰위치 배열 

    //public GameObject Monster;


    [SerializeField] GameObject level1Monster;
    [SerializeField] GameObject level2Monster;
    [SerializeField] GameObject bossMonster;


    // 몬스터를 순서별로 저장할 큐
    Queue<GameObject> monsterQueue = new Queue<GameObject>();

    private void Awake()
    {
        // level 1 몬스터 5개
        for(int i = 0; i < 5; i++)
        {
            monsterQueue.Enqueue(level1Monster);
        }
        // level 2 몬스터 4개
        for(int i = 0; i < 4; i++)
        {
            monsterQueue.Enqueue(level2Monster);
        }
        // 보스 몬스터 1개
        monsterQueue.Enqueue(bossMonster);

        MonsterCount.Instance.monsterCount = monsterQueue.Count;
    }

    private void Start()
    {
        // SpawnMonster함수를 2초후에 5초마다 실행
        InvokeRepeating("SpawnMonster", 2, 5);
    }

    // 스폰 랜덤 위치 몬스터 생성
    void SpawnMonster()
    {
        int ran = Random.Range(0, spawnPoints.Length);

        if(monsterQueue.Count != 0)
        {
            // 큐에서 하나씩 빼기
            GameObject monsterSpawn = monsterQueue.Dequeue();
            
            GameObject myMonster =
                Instantiate(monsterSpawn, spawnPoints[ran].position, Quaternion.identity);
            
            myMonster.transform.SetParent(spawnPoints[ran]);

            // 목적지 설정
            var spawnPointComponent = spawnPoints[ran].GetComponent<SpawnPoint>();

            if (spawnPointComponent != null)
            {
                myMonster.GetComponent<MonsterController>().FinalDestination = spawnPointComponent.Destination;
            }
            else
            {
                Debug.LogError("SpawnPoint 컴포넌트를 찾을 수 없습니다.");
            }
            //MonsterCount.Instance.IncreaseCount(); // 몬스터 카운트 증가
        }
    }
}

결과

결과적으로 level1 몬스터가 5마리, level2 몬스터가 4마리, 보스 몬스터 1마리가 순서대로 생성된다

profile
뉴비 개발자

0개의 댓글