구현 기능
- 일정 범위 내에서 Monster의 개수가 유지되도록 Moster 사망 시 자동 생성
- 일정 범위 내 Monster 생성 위치 랜덤 지정
public class SpawningPool : MonoBehaviour
{
[SerializeField] int _monsterCount = 0; //실존 몬스터
[SerializeField] int _reserveCount = 0; //예약한 스폰 몬스터
[SerializeField] int _keepMonsterCount = 0;
[SerializeField] Vector3 _spawnPos;
[SerializeField] float _spawnRadius = 15.0f;
[SerializeField] float _spawnTime = 5.0f;
public void AddMonsterCount(int value) { _monsterCount += value; }
public void SetKeepMonsterCount(int count) { _keepMonsterCount = count; }
void Start()
{
Managers.Game.OnSpawnEvent -= AddMonsterCount;
Managers.Game.OnSpawnEvent += AddMonsterCount;
}
void Update()
{
while (_reserveCount + _monsterCount < _keepMonsterCount)
{
StartCoroutine("ReserveSpawn");
}
}
IEnumerator ReserveSpawn()
{
_reserveCount++;
//스폰 시간 랜덤
yield return new WaitForSeconds(Random.Range(0, _spawnTime));
GameObject obj = Managers.Game.Spawn(Define.WorldObject.Monster, "Knight");
NavMeshAgent nma = obj.GetOrAddComponent<NavMeshAgent>();
//스폰 위치 랜덤
Vector3 randPos;
while (true)
{
Vector3 randDir = Random.insideUnitSphere * Random.Range(0, _spawnRadius);
randDir.y = 0;
randPos = _spawnPos + randDir;
//갈 수 있는 곳인지 확인
NavMeshPath path = new NavMeshPath();
if (nma.CalculatePath(randPos, path))
break;
}
obj.transform.position = randPos;
_reserveCount--;
}
}