Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Все Вопросы Мои Вопросы

Проблема со спавном объекта

Unity2D

Не могу разобраться в коде из туториала. Код следующий:

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 год назад

Привет, да ты все правильно понял. Создать переменную которая будет следить за тем сколько времени прошло обычная практика. Но есть варианты сделать код более читабельным используя корутины:
Для данного варианта в коде мы переделаем метод Update - который вызывается каждый кадр на корутину. Это позволяет добавить ожидание перед спавном 1 строчкой.

yield return new WaitForSeconds(_timeToSpawn);

т.к данная конструкция сама следит за временем, то от приватной переменной time можно избавится. После чего происходит спавн объекта. Чтобы все это работало бесконечно, то засовываем ожидание и спавн объекта под бесконечный цикл
while(true){}

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 год назад

И несколько рекомендаций по общему коду, старайся избегать публичных полей если в этом нет необходимости пример:

public GameObject pipePrefab;

лучше заменить на
[SerializeField] private GameObject _pipePrefab;

[SerializeField] - служат для того чтобы приватное поле отображалось в инспекторе.
в данном случае поле хранит GameObject для его создания, скорее всего изменять этот объект ты не будешь, а значит и делать его публично не имеет смысла, иначе из любого другого класса можно будет изменить эту переменную. Тоже самое и со временем ожидания, если ты не подразумеваешь изменения ее из другого класса, то лучше сделать ее приватной. А попутно задать возможные границы чтобы в будущем не поставить отрицательное число, т.к время ожидания не мб отрицательным по логике.
Также если ты не собираешься ничего делать с объектом который создал, то нем смысла переменной присваивать результат работы метода Instantiate:
GameObject pipe = Instantiate(pipePrefab, transform.position, Quaternion.identity)

можно заменить на
Instantiate(pipePrefab, transform.position, Quaternion.identity)


NoNameNS 1 год назад

Также у метода Instantiate много перегрузок(т.е того как он может работать), по этому методу можно почитать тут https://unityhub.ru/scripting/Object.Instantiate

NoNameNS 1 год назад

Если появятся вопросы может написать мне напрямую:
Дискорд - nonamens
Телеграмм - @Andrey_Panchenko34

Name_1244 1 год назад

NoNameNS, спасибо большое за развернутый ответ, преподнесли на блюдечке так много рекомендаций для анализа

NoNameNS 1 год назад

Name_1244, Нет проблем если будут вопросы обращайся

Гости не могут отвечать на вопросы. Войдите на Сайт или Зарегистрируйтесь