Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Creación de ítems para el jugador

21/40
Recursos

Aportes 7

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Para tener el radio del spawn mejor controlado:

Podemos apoyarnos del evento OnDrawGizmos.

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, spawnRadius);
    }

El cual nos dibujara un gizmo en la vista del editor de Unity del circulo en el cual se pueden instanciar nuestros objetos.
Parametros:

Posición del centro del circulo(En este caso, la posición de mi spawn system)
Tamaño del radio(En este caso, la misma variable que multiplica al Random.insideUnitCircle)

En el script de ItemSpawner, hace falta un pequeño detalle y es que el Checkpoint siempre se va a estar generando en el Transform de su prefab. En dado caso que este en el origen, el spawner siempre creara un checkpoint en el radio dado en su origen.

Para que el checkpoint spawnee alrededor del ItemSpawner es necesario sumar al Vector2 randomPosition el transform.position. Quedaria de la siguiente manera la rutina:

 IEnumerator SpawnCheckpointRoutine()
    {
        while (true)
        {
            yield return new WaitForSeconds(checkPointsSpawnDelay);
            Vector2 randomPosition = (Vector2)transform.position + Random.insideUnitCircle * spawnRadius;
            Instantiate(checkPointPrefab, randomPosition, Quaternion.identity);
        }
    }

Al momento de hacer una variable pública, haces que esta automáticamente, se serialice en el editor de Unity.

A pesar de tener serializadas las variables que son public, tenemos que utilizar El Serialize Field en las variables que no vayana a utilizar otros objetos, por buenas prácticas.

No quieres tener números mágicos en el tu código (Referente a números sin justificación)

Aproveché y apliqué el método del spawner de items para que el Spawner de enemigos tenga el mismo tipo de funcionamiento para cada uno de los SpawnPoints, también apliqué el Gizmo del comentario de Ricardo Rito Anguiano.

Yo realizo el proceso de selección de SpawnPoint dentro del EnemySpawner porque me parece más indicado que desde el enemigo.

Este sería mi código:

    [SerializeField] GameObject[] enemyPrefab = new GameObject[2];
    List<GameObject> spawnPoints = new List<GameObject>();
    float spawnTime = 3;
    float radius = 2;

    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(SpawnNewEnemy());
        spawnPoints.AddRange(GameObject.FindGameObjectsWithTag("SpawnPoint"));
    }

    IEnumerator SpawnNewEnemy()
    {
        while (true)
        {
            yield return new WaitForSeconds(spawnTime);
            float random = Random.Range(0.0f, 1.0f);
            int index = random < GameManager.sharedInstance.difficulty * 0.1f ? 1 : 0;
            GameObject randomSpawnPoint = spawnPoints[Random.Range(0, spawnPoints.Count)];
            Vector2 randomPos = Random.insideUnitCircle * radius + (Vector2)randomSpawnPoint.transform.position;
            Instantiate(enemyPrefab[index],randomPos,Quaternion.identity);
        }
    }

    private void OnDrawGizmos()
    {
        Gizmos.color = Color.green;

        foreach(GameObject spawnPoint in spawnPoints)
        {
            Gizmos.DrawWireSphere(spawnPoint.transform.position,radius);
        }
    }

Genial