using UnityEngine; // 유니티 기능을 불러올거에요 -> UnityEngine을 using System.Collections; // 코루틴을 사용할거에요 -> System.Collections를 using System.Collections.Generic; // 리스트를 사용할거에요 -> System.Collections.Generic을 public class MonsterSpwaner : MonoBehaviour // 클래스를 선언할거에요 -> 몬스터 스포너를 { [Header("스폰 설정")] // 인스펙터 제목을 달거에요 -> 스폰 설정을 [SerializeField] private List monsterPrefabs; // 리스트를 선언할거에요 -> 몬스터 프리팹들을 [SerializeField] private List spawnPoints; // 리스트를 선언할거에요 -> 스폰 위치들을 [SerializeField] private float spawnInterval = 5f; // 변수를 선언할거에요 -> 스폰 간격을 [SerializeField] private int maxMonsters = 20; // 변수를 선언할거에요 -> 최대 몬스터 수를 // 오브젝트 풀 (선택 사항) // private GenericObjectPool pool; // 나중에 풀링 시스템과 연동 가능 private int currentMonsterCount = 0; // 변수를 선언할거에요 -> 현재 몬스터 수를 private void Start() // 함수를 실행할거에요 -> 시작 Start를 { StartCoroutine(SpawnRoutine()); // 실행할거에요 -> 스폰 코루틴을 MonsterClass.OnMonsterKilled += HandleMonsterDeath; // 구독할거에요 -> 몬스터 사망 이벤트를 } private void OnDestroy() // 함수를 실행할거에요 -> 파괴될 때 { MonsterClass.OnMonsterKilled -= HandleMonsterDeath; // 해지할거에요 -> 이벤트 구독을 } private void HandleMonsterDeath(int exp) // 함수를 선언할거에요 -> 사망 처리 핸들러를 { currentMonsterCount--; // 줄일거에요 -> 현재 몬스터 수를 if (currentMonsterCount < 0) currentMonsterCount = 0; // 보정할거에요 -> 0 밑으로 안 가게 } private IEnumerator SpawnRoutine() // 코루틴 함수를 정의할거에요 -> 반복 스폰 로직을 { while (true) // 반복할거에요 -> 무한히 { if (currentMonsterCount < maxMonsters) // 조건이 맞으면 실행할거에요 -> 꽉 차지 않았다면 { SpawnMonster(); // 실행할거에요 -> 스폰 함수를 } yield return new WaitForSeconds(spawnInterval); // 기다릴거에요 -> 간격만큼 } } private void SpawnMonster() // 함수를 선언할거에요 -> 실제 생성 로직을 { if (monsterPrefabs.Count == 0 || spawnPoints.Count == 0) return; // 중단할거에요 -> 설정이 없으면 // 랜덤 선택 GameObject prefab = monsterPrefabs[Random.Range(0, monsterPrefabs.Count)]; // 뽑을거에요 -> 랜덤 몬스터를 Transform point = spawnPoints[Random.Range(0, spawnPoints.Count)]; // 뽑을거에요 -> 랜덤 위치를 // 생성 (풀링을 쓴다면 pool.Get() 사용) GameObject mob = Instantiate(prefab, point.position, point.rotation); // 생성할거에요 -> 몬스터를 // 초기화 확인 if (mob.TryGetComponent(out var monsterScript)) // 가져올거에요 -> 몬스터 스크립트를 { monsterScript.ResetStats(); // 실행할거에요 -> 스탯 초기화를 monsterScript.Reactivate(); // 실행할거에요 -> 활성화를 } currentMonsterCount++; // 늘릴거에요 -> 카운트를 } }