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--;
}