67 lines
3.4 KiB
C#
67 lines
3.4 KiB
C#
using UnityEngine; // 유니티 기능을 불러올거에요 -> UnityEngine을
|
|
using System.Collections; // 코루틴을 사용할거에요 -> System.Collections를
|
|
using System.Collections.Generic; // 리스트를 사용할거에요 -> System.Collections.Generic을
|
|
|
|
public class MonsterSpwaner : MonoBehaviour // 클래스를 선언할거에요 -> 몬스터 스포너를
|
|
{
|
|
[Header("스폰 설정")] // 인스펙터 제목을 달거에요 -> 스폰 설정을
|
|
[SerializeField] private List<GameObject> monsterPrefabs; // 리스트를 선언할거에요 -> 몬스터 프리팹들을
|
|
[SerializeField] private List<Transform> 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<MonsterClass>(out var monsterScript)) // 가져올거에요 -> 몬스터 스크립트를
|
|
{
|
|
monsterScript.ResetStats(); // 실행할거에요 -> 스탯 초기화를
|
|
monsterScript.Reactivate(); // 실행할거에요 -> 활성화를
|
|
}
|
|
|
|
currentMonsterCount++; // 늘릴거에요 -> 카운트를
|
|
}
|
|
} |