Render.ru

инстантирование с задержкой по времени

люся зюзина

Активный участник
Рейтинг
13
#1
Здравствуйте!
Я новичок в Юнити.
Мне нужно сделать инстансы. Я использовала такой код:
void Start() {

for (int i=1; i <num; i++) {
GameObject instance = Instantiate(thePrefab, new Vector3((i-4) * 2.0F, 0, 0), Quaternion.identity)
as GameObject;
};
Но мне нужно, чтобы инстансы возникали не все сразу при старте, а по очереди, с задержкой относительно друг друга, скажем в 3 милисекунды.
Подозреваю, что надо как-то использовать Time.Time, но не смогла его вставить.
Помогите, пожалуйста!
 

NapalmRain

Активный участник
Рейтинг
15
#2
Здравствуйте!
...
Подозреваю, что надо как-то использовать Time.Time, но не смогла его вставить.
Помогите, пожалуйста!
Самый простой способ использовать не Time.Time, а Time.Deltatime - это время, которое проходит при смене одного кадра на другой.
Как известно, Update() (LateUpdate(), FixedUpdate()) - (я бы советовал использовать те, что в скобках, а именно LateUpdate, так как он вызывается уже после отрисовки кадра, а значит не мешает рендерингу) вызываются каждый кадр, таким образом можно получить импровизированный счётчик:

К примеру:
Код:
float lv_timer;
int needCount, curCount;

void Start() {
    lv_timer = 0; // обнуляем счётчик времени
    needCount = 5; // сколько объектов надо разместить
    curCount = 0; // сейчас размещено
}

void LateUpdate() {
    if (curCount<needCount) { // если размещено меньше, чем надо
        lv_timer += Time.DeltaTime; // прибавляем к текущему значению счётчика время, прошедшее с прошлого кадра
        if (lv_timer>3) { // если прошло больше трёх секунд, обнуляем счётчик и вызываем инстантиейт
            CallInst();
            lv_timer = 0;
        }
    }
}

void CallInst(/*можно передавать объект, который надо разместить*/) {
    // Собственно, ваш инстантиейт
    curCount++;
}
Код не проверялся на работоспособность, писался сразу сюда. Но, я надеюсь, суть уловить по нему можно
 

NapalmRain

Активный участник
Рейтинг
15
#5
Получилось, только пришлось так сделать:
lv_timer += UnityEngine.Time.deltaTime;
а то писал ошибку error CS0117 ...
Вполне может быть, хотя это ещё зависит от версии Юнити, которой вы пользуетесь.
По крайней мере в 4 версии и позднее, если у вас в начале кода написано
Код:
using UnityEngine;
Всё должно работать
 

NapalmRain

Активный участник
Рейтинг
15
#8
Проверил. Всё должно работать.
Перед описанием класса если есть
Код:
using UnityEngine; 
using System.Collections;

public class ExapleClass : MonoBehaviour { ...
 

люся зюзина

Активный участник
Рейтинг
13
#9
Да, действительно, вы правы - выкинула
UnityEngine, но все работает.
Видимо, когда он писал мне эту ошибку, ему что-то другое не нравилось на самом деле (что я исправила). Я так заметила, что он иногда слегка промахивается...
 

люся зюзина

Активный участник
Рейтинг
13
#11
У меня такая задумка - инстанты должны с задержкой по времени не только появляться, но и выполнять какие-то действия. Пока что у меня эти действия управляются из скрипта, висящего на префабе. Например, взмах рукой по нажатию на клавишу. И рукой они машут все одновременно, а я хочу, чтобы поочередно.
Я придумала один способ.
Я вешаю на префаба тригер, и делаю невидимый объект, который едет, "задевая" по очереди моих клонов, и они выполняют какие-то назначенные действия. Но этот способ кажется мне надуманным - должно быть что-то проще.
 
Сверху