Не смешивайте разные обязанности в одном классе.
Это делает ваш код подверженным ошибкам и становится все труднее поддерживать, так как этот класс становится больше. У вас должен быть спавнер, который порождает яблоки, и яблочный сборный с коллайдером. Два разных сценария.
public class Spawner : MonoBehaviour {
private static readonly int[] positions = { -10, -5, 0, 5, 10 };
public int NumberOfSeconds;
private System.Random rand = new System.Random();
public GameObject Prefab;
public IEnumerator Start() {
while (true) {
int randomX = positions[rand.Next(5)];
Instantiate(Prefab, new Vector3(randomX, 5, 0), transform.rotation);
yield return new WaitForSeconds(NumberOfSeconds);
}
}
}
У объектов с этим компонентом не должно быть коллайдеров или спрайтов в вашем случае, поэтому они никогда не будут уничтожены при столкновении с игроком. Приготовленные префабы - ваши обычные яблоки, которые игрок собирает или избегает.
Поскольку создатель не производит других создателей, мы помещаем логику появления в цикл.
Возможно, вы хотите получить случайную позицию из массива вместо необработанного случайного числа, поэтому я исправил это.
Обобщить.
Теперь ваш спавнер выполняет единственную функцию - порождение. Это больше не связано с яблоками, так что вы можете выращивать морковь с другим производителем. Логика остается прежней.
Что это за магия в Start
?
Вы можете сделать Start
сопрограммой. Он работает так же, как любая другая сопрограмма: работает до yield return
, yield break
или до конца функции. Последние два заканчивают сопрограмму, иначе она ждет, а затем продолжает работать. Это лучше, чем флаги в Update
управлении сопрограммами.
Если вам нужен скрипт, который должен запускать каждый кадр, тогда используйте Update
.