Спавн объекта в рандомной позиции unity

Игра 2д. Суть в том, что бы написать скрипт, который будет спавнить обьекты по оси в рандомном месте по оси X в диапазоне, который я могу задать.

С каждым 10-м или 5-м заспавненным объектом должна увеличиваться скорость спавна до определенной скорости которая, например, после 100 спавнов больше увеличиваться не будет. Спустя 8 секунд объект должен удалиться.

Зачем мне это нужно: хочу сделать так, чтобы блоки падали вниз и были своего рода Енеми для игрока. Я пытался писать свои скрипты, но они не работали.


Ответы (1 шт):

Автор решения: Максим Фисман

Вам потребуется 2 класса (2 скрипта). Первый - скрипт вашего Enemy, который будет спавниться. Второй: скрипт игровой логики, который и будет спавнить. Скрипт игровой логики можно повесить на камеру или на отдельный пустой объект GameLogic - вам решать.

Чтобы скрипт игровой логики спавнил ваших Enemy,в нем должен быть примерно такой код:

public GameObject enemyPrefab; // Префаб вашего Enemy
public int timeBetweenSpawn; // Изначальное время между спавнами enemy
public int enemyAmount; // Количество врагов, которое вы хотите заспавнить

private void Start () {
    StartCoroutine(spawnEnemy());
}
private IEnumerator spawnEnemy () {
    int countSpawn = 0; // Переменная, которая будет подсчитывать, сколько врагов мы заспавнили
    while (countSpawn < enemyAmount) {
        countSpawn++;
        int xPos = Random.Range([минимальный Х], [максимальный Х]); // Берем рандомный X
    
        // Спавним объект enemyPrefab в указанной позиции без разворотов по осям
        Instantiate(enemyPrefab, new Vector3(xPos, [координата Y], [Координата Z]), Quaternion.identity);
        

        //Если заспавнили 10 врагов и их меньше 100, уменьшаем время между спавном на секунду
        if (countSpawn % 10 == 0 && countSpawn <= 100) {
            timeBetweenSpawn -= 1; // 
        }

        yield return new WaitForSeconds(timeBetweenSpawn);
}
}

Скрипт Enemy должен просто выжидать 8 секунд, после чего самоуничтожаться:

public int timeToDeath; // Время жизни до удаления
private void Start () {
    StartCoroutine(selfDestroying());
}
private IEnumerator selfDestroying () {
    yield return new WaitForSeconds(timeToDeath); // Ждем
    Destroy(gameObject);
}

А вообще, если вы говорите, что enemy будут падать, то есть вариант проверять, когда они оказались ниже нижней границы экрана, после чего удалять их.

Если мой ответ был вам полезен, пожалуйста, поставьте галочку, чтобы принять ответ, и стрелочку вверх над ней (типа лайка). Если у вас остались вопросы - задавайте!

→ Ссылка