Не могу разобраться в коде из туториала. Код следующий:
public GameObject pipePrefab;
public float timeToSpawn;
private float timer;
private void Start {
timer = timeToSpawn;
}
private void Update {
if (timer <= 0)
{
timer = timeToSpawn;
GameObject pipe = Instantiate(pipePrefab, transform.position, Quaternion.identity)
}
else {
timer -=Time.deltaTime
}
В этом коде не могу разобраться как работает промежуток между спавнами.
Как я понял в методе Start приватной переменной timer присваиваем значение публичной переменной timeToSpawn указанной в инспекторе юнити. И если переменная timer положительная, то она уменьшается до тех пор, пока не станет отрицательной, и только потом переменной timer снова присваивается значение переменной timeToSpawn указанной в юнити. В результате создаются экземпляры объекта на основе родителя. Не понимаю к чему так сложно и запутанно. Или я такой тупой и не могу понять?
Комментарии
7
NoNameNS
1 год назад
В итоге изменений получим вот такой код:
using System.Collections;
using UnityEngine;
public class Spawner : MonoBehaviour
{
// Префаб, которую мы будем создавать
[SerializeField] private GameObject _pipePrefab;
// Время в секундах между созданием новых объектов
[SerializeField, Range(0.01f, 1000000)] private float _timeToSpawn;
private void Start()
{
// Начинаем корутину при запуске сцены
StartCoroutine(SpawnObjectsRoutine());
}
private IEnumerator SpawnObjectsRoutine()
{
// Бесконечный цикл для создания объектов
while (true)
{
// Ждем указанное время перед созданием новой объекта
yield return new WaitForSeconds(_timeToSpawn);
// Создаем новую объект в позиции спаунера
Instantiate(_pipePrefab, transform.position, Quaternion.identity);
}
}
}
NoNameNS
1 год назад
лучше заменить на
[SerializeField] - служат для того чтобы приватное поле отображалось в инспекторе.
в данном случае поле хранит GameObject для его создания, скорее всего изменять этот объект ты не будешь, а значит и делать его публично не имеет смысла, иначе из любого другого класса можно будет изменить эту переменную. Тоже самое и со временем ожидания, если ты не подразумеваешь изменения ее из другого класса, то лучше сделать ее приватной. А попутно задать возможные границы чтобы в будущем не поставить отрицательное число, т.к время ожидания не мб отрицательным по логике.
Также если ты не собираешься ничего делать с объектом который создал, то нем смысла переменной присваивать результат работы метода Instantiate:
можно заменить на
И несколько рекомендаций по общему коду, старайся избегать публичных полей если в этом нет необходимости пример:
public GameObject pipePrefab;
лучше заменить на
[SerializeField] private GameObject _pipePrefab;
[SerializeField] - служат для того чтобы приватное поле отображалось в инспекторе.
в данном случае поле хранит GameObject для его создания, скорее всего изменять этот объект ты не будешь, а значит и делать его публично не имеет смысла, иначе из любого другого класса можно будет изменить эту переменную. Тоже самое и со временем ожидания, если ты не подразумеваешь изменения ее из другого класса, то лучше сделать ее приватной. А попутно задать возможные границы чтобы в будущем не поставить отрицательное число, т.к время ожидания не мб отрицательным по логике.
Также если ты не собираешься ничего делать с объектом который создал, то нем смысла переменной присваивать результат работы метода Instantiate:
GameObject pipe = Instantiate(pipePrefab, transform.position, Quaternion.identity)
можно заменить на
Instantiate(pipePrefab, transform.position, Quaternion.identity)
Гости не могут отвечать на вопросы. Войдите на Сайт или Зарегистрируйтесь
Привет, да ты все правильно понял. Создать переменную которая будет следить за тем сколько времени прошло обычная практика. Но есть варианты сделать код более читабельным используя корутины:
Для данного варианта в коде мы переделаем метод Update - который вызывается каждый кадр на корутину. Это позволяет добавить ожидание перед спавном 1 строчкой.
т.к данная конструкция сама следит за временем, то от приватной переменной time можно избавится. После чего происходит спавн объекта. Чтобы все это работало бесконечно, то засовываем ожидание и спавн объекта под бесконечный цикл