Суббота, 20 Апреля 2024, 08:22

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Заморозить объекты на сцене (Для 2д)
Заморозить объекты на сцене
dreenlineДата: Пятница, 25 Марта 2016, 19:15 | Сообщение # 1
постоянный участник
Сейчас нет на сайте
Привет! Есть скрипт. После уничтожения врага рандомно создаются кубики на сцене. Как сделать так, что бы перед созданием кубиков все объекты на сцене останавливались, создавались кубики, а через некоторое время все объекты размораживались.
Пробовал делать через корутин и Time.timeScale, но это не помогает, т.к. все должно выглядеть так. Враг умирает, все объекты замирают, через некоторое время создаются кубики, еще через некоторое время кубики уничтожаются и все объекты размораживаются.
Пробовал так.


но т.к мы выключаем время, отсчет от loadDelay не идет. Может есть какой-нибудь другой способ заморозить все объекты на сцене?
А, еще timeScale тут использовать нельзя, т.к. партикли тоже замирают, а они нужны
LertmindДата: Пятница, 25 Марта 2016, 19:38 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Вот перевод статьи про кастомные корутины https://habrahabr.ru/post/274305/, там пример реализации WaitForSeconds независящий от timeScale. Важно заметить, что к оригинальной статье было замечание в комментарии, вместо realtimeSinceStartup надо использовать unscaledTime, чтобы не было проблем при сворачивании игры. Код с улучшением:
Код
using UnityEngine;

public class WaitForSecondsRealtime : CustomYieldInstruction
{
    private float waitTime;
    
    public override bool keepWaiting
    {
        get { return Time.unscaledTime < waitTime; }
    }
    
    public WaitForSecondsRealtime(float time)
    {
        waitTime = Time.unscaledTime + time;
    }
}

Теперь вместо yield return new WaitForSeconds (loadDelay); пишешь yield return new WaitForSecondsRealtime (loadDelay);.
Как вариант из статьи (задержка 5 секунд):
Код
float waitTime = Time.unscaledTime + 5;
yield return new WaitWhile(() => Time.unscaledTime < waitTime);

Добавлено (25 марта 2016, 19:38)
---------------------------------------------
Про частицы ответ здесь http://answers.unity3d.com/questio....em.html.

Сообщение отредактировал Lertmind - Пятница, 25 Марта 2016, 19:34
dreenlineДата: Воскресенье, 27 Марта 2016, 17:42 | Сообщение # 3
постоянный участник
Сейчас нет на сайте
Lertmind, СПАСИБО! Все работает!

Добавлено (25 марта 2016, 20:07)
---------------------------------------------
Партикли по прежнему не работают( Сделал как написано там, толку 0, они не проигрываются при scaleTime = 0 sad Буду искать дальше
Точнее они проигрываются, но очень очень быстро, их почти не заметить
Разобрался! На партиклях стоял скрипт Destroy Finished Particle.

Добавлено (27 марта 2016, 17:42)
---------------------------------------------
Еще вопрос. Как можно обратиться ко всем одинаковым скриптам? Вот у меня есть скрипт, при котором стрелы летят во врага. Я сделал так. Создал на врага скрипт, при нажатии на него, в скрипте со стрелой false меняется на true, и стрела летит во врага. Но проблема, если у меня несколько стрел на экране, летит во врага только одна. Как это можно исправить?
Вот сами скрпипты
Стрелы:


А вот скрипт, который повесил на врага:


Сейчас получается так, что 2 скрипт обращается только к последнему добавленному объекту на сцену


Сообщение отредактировал dreenline - Воскресенье, 27 Марта 2016, 18:37
LertmindДата: Воскресенье, 27 Марта 2016, 19:02 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Вместо Object.FindObjectOfType используй Object.FindObjectsOfType возвращает все объекты данного типа:
Код
    public float moveSpeed;

    private EnemyCube theEnemy;

    private ArrowBack[] startNow;
    // Use this for initialization
    void Start () {
        startNow = FindObjectsOfType<ArrowBack> ();
        theEnemy = FindObjectOfType<EnemyCube> ();
        //startNow.enabled = false;
    }

    // Update is called once per frame
    void Update () {

    }

    void OnMouseDown()
    {
        foreach (var sn in startNow)
            sn.itsReadyTrue ();
        Debug.Log ("Cube Work");
    }
}

Добавлено (27 марта 2016, 19:02)
---------------------------------------------
Хотя тебе надо в OnMouseDown перенести startNow = FindObjectsOfType<ArrowBack> ();, потому что их надо искать во время клика.

dreenlineДата: Воскресенье, 27 Марта 2016, 19:56 | Сообщение # 5
постоянный участник
Сейчас нет на сайте
Lertmind, Большое спасибо! Помогло! И вроде разобрался как это работает! Сори, но + в репу поставить не смогу еще 5 дней (
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Заморозить объекты на сцене (Для 2д)
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг