ReserveSpawn()
메서드에서 몬스터의 스폰 위치를 결정하는 부분을 살펴보면, Random.insideUnitCircle
를 사용하여 랜덤한 방향을 생성하고 이를 _spawnRadius
로 스케일링하고 있다. 그러나 이 코드는 원의 내부에서 랜덤한 위치를 생성하기 때문에, 원의 중심에 가까운 위치가 선택될 확률이 더 높다.
원 안에서 균등하게 분포된 랜덤한 점을 얻으려면 각도와 반지름 모두에 대해 랜덤 값을 사용해야 한다.
수정코드
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)
{
float radius = Mathf.Sqrt(Random.value) * _spawnRandius;
float angle = Random.value * 2 * Mathf.PI;
Vector3 randomDir = new Vector3(radius * Mathf.Cos(angle), 0, radius * Mathf.Sin(angle));
randPos = _spawnPos + randomDir;
NavMeshPath path = new NavMeshPath();
if (nma.CalculatePath(randPos, path))
break;
}
obj.transform.position = randPos;
_reserveCount--;
}