1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Unity3D", создана пользователем люся зюзина, 16 июл 2015.

Модераторы: punkvideo
  1. люся зюзина

    люся зюзина Активный участник

    С нами с:
    09.01.2006
    Сообщения:
    382
    Симпатии:
    0
    Баллы:
    14
    Здравствуйте!
    Я новичок в Юнити.
    Мне нужно сделать инстансы. Я использовала такой код:
    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, но не смогла его вставить.
    Помогите, пожалуйста!
     
  2. NapalmRain

    NapalmRain Активный участник

    С нами с:
    28.05.2014
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    5
    Самый простой способ использовать не 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++;
    }
    Код не проверялся на работоспособность, писался сразу сюда. Но, я надеюсь, суть уловить по нему можно
     
  3. люся зюзина

    люся зюзина Активный участник

    С нами с:
    09.01.2006
    Сообщения:
    382
    Симпатии:
    0
    Баллы:
    14
    Спасибо, сейчас буду пробовать.
     
  4. люся зюзина

    люся зюзина Активный участник

    С нами с:
    09.01.2006
    Сообщения:
    382
    Симпатии:
    0
    Баллы:
    14
    Получилось, только пришлось так сделать:
    lv_timer += UnityEngine.Time.deltaTime;
    а то писал ошибку error CS0117 ...
     
  5. NapalmRain

    NapalmRain Активный участник

    С нами с:
    28.05.2014
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    5
    Вполне может быть, хотя это ещё зависит от версии Юнити, которой вы пользуетесь.
    По крайней мере в 4 версии и позднее, если у вас в начале кода написано
    Код:
    using UnityEngine;
    Всё должно работать
     
  6. люся зюзина

    люся зюзина Активный участник

    С нами с:
    09.01.2006
    Сообщения:
    382
    Симпатии:
    0
    Баллы:
    14
    Пользуюсь 5-й, но бесплатной :)
     
  7. NapalmRain

    NapalmRain Активный участник

    С нами с:
    28.05.2014
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    5
    ну разницы в коде при платности/бесплатности нет. Дома буду проверю.
     
  8. NapalmRain

    NapalmRain Активный участник

    С нами с:
    28.05.2014
    Сообщения:
    43
    Симпатии:
    0
    Баллы:
    5
    Проверил. Всё должно работать.
    Перед описанием класса если есть
    Код:
    using UnityEngine; 
    using System.Collections;
    
    public class ExapleClass : MonoBehaviour { ...
    
     
  9. люся зюзина

    люся зюзина Активный участник

    С нами с:
    09.01.2006
    Сообщения:
    382
    Симпатии:
    0
    Баллы:
    14
    Да, действительно, вы правы - выкинула
    UnityEngine, но все работает.
    Видимо, когда он писал мне эту ошибку, ему что-то другое не нравилось на самом деле (что я исправила). Я так заметила, что он иногда слегка промахивается...
     
  10. люся зюзина

    люся зюзина Активный участник

    С нами с:
    09.01.2006
    Сообщения:
    382
    Симпатии:
    0
    Баллы:
    14
    А как дать этим инстантам номера? Чтобы как-то получить доступ к каждому из них по номеру?
     
  11. люся зюзина

    люся зюзина Активный участник

    С нами с:
    09.01.2006
    Сообщения:
    382
    Симпатии:
    0
    Баллы:
    14
    У меня такая задумка - инстанты должны с задержкой по времени не только появляться, но и выполнять какие-то действия. Пока что у меня эти действия управляются из скрипта, висящего на префабе. Например, взмах рукой по нажатию на клавишу. И рукой они машут все одновременно, а я хочу, чтобы поочередно.
    Я придумала один способ.
    Я вешаю на префаба тригер, и делаю невидимый объект, который едет, "задевая" по очереди моих клонов, и они выполняют какие-то назначенные действия. Но этот способ кажется мне надуманным - должно быть что-то проще.
     
  12. SquaLL

    SquaLL Знаток

    С нами с:
    10.01.2006
    Сообщения:
    368
    Симпатии:
    91
    Баллы:
    59
Модераторы: punkvideo

Поделиться этой страницей