Где логика?

Общие вопросы о Unity3D

Где логика?

Сообщение emelian1917 21 июл 2017, 03:17

Полночи потратил, изучая пять строк элементарного кода, не в силах понять, где ошибка.
Код просто включает/выключает объект через промежутки времени.

private void Update()
{
timer1 += Time.deltaTime;
if (timer1 >= 0.01f)
{
sphere.SetActive(change);
if (change == true) change = false; else change = true;
timer1 = 0f;
}
}
}

Так вот. В 2017 Unity Debug.Log(timer1); выдаёт два прохода от 0 до указанного промежутка, а затем уходит в ноль и никак не реагирует. Мигания нет.

Теперь ВСЁ ровным счётом точно также на 5.4.1f1 и всё работает. Объект мигает, дебаг повторяет значения с каждым Update.

Я, мягко сказать, удивлён.
emelian1917
UNец
 
Сообщения: 11
Зарегистрирован: 11 июл 2016, 12:38

Re: Где логика?

Сообщение samana 21 июл 2017, 08:04

Код вроде рабочий, может у вас было несколько одинаковых скриптов на объекте?
Так же можете использовать Invoke или корутину, чтобы создать таймер с определённым интервалом.
И ещё ваш код можно упростить до
Синтаксис:
Используется csharp
private void Update()
{
    timer1 += Time.deltaTime;
    if (timer1 >= 0.01f)
    {
        sphere.SetActive(!sphere.activeSelf);
        timer1 = 0f;
    }
}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Где логика?

Сообщение x-mas 21 июл 2017, 10:05

В таких случаях не легче для системы делать прозрачным объект, если он не взаимодействует с миром? SetActive в апдейте вроде не очень хорошо.
Аватара пользователя
x-mas
UNец
 
Сообщения: 43
Зарегистрирован: 23 фев 2017, 12:51

Re: Где логика?

Сообщение samana 21 июл 2017, 10:12

x-mas писал(а):В таких случаях, не легче для системы делать прозрачным объект, если он не взаимодействует с миром?

Если сделать прозрачным, то объект будет продолжать так же дальше ренедрится, плюс добавится прозрачность (операции с наложением альфы в шейдере, хотя оно делается быстро), к тому же все скрипты этого объекта будут продолжать работать (если скрипты есть). А выключив объект, вы сразу исключаете его из рендера и выключаете его скрипты, в общем меньше объектов станет обрабатываться.

x-mas писал(а):SetActive в апдейте вроде не очень хорошо.

Почему так?
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Где логика?

Сообщение x-mas 21 июл 2017, 10:30

samana писал(а):
x-mas писал(а):В таких случаях, не легче для системы делать прозрачным объект, если он не взаимодействует с миром?

Если сделать прозрачным, то объект будет продолжать так же дальше ренедрится, плюс добавится прозрачность (операции с наложением альфы в шейдере, хотя оно делается быстро), к тому же все скрипты этого объекта будут продолжать работать (если скрипты есть). А выключив объект, вы сразу исключаете его из рендера и выключаете его скрипты, в общем меньше объектов станет обрабатываться.

x-mas писал(а):SetActive в апдейте вроде не очень хорошо.

Почему так?


Есть два варианта:
1. Объект должен мигать.
1.1. Скрипт висит на объекте. Работать не будет т.к. после деактивации, перестанет работать скрипт и объект не появится.
1.2. Скрипт висит на другом объекте. Все должно работать, при этом надо не забыть поставить ссылку на объект мигания. Если на объекте
мигания есть другие скрипты, то 20 раз активируя его в секунду, будут также запускаться все скрипты. Должно нагружать
систему.
2. Объект не должен мигать.
1.1. Скрипт висит на объекте. Работать не будет т.к. после деактивации, перестанет работать скрипт и объект не появится.
1.2. Скрипт висит на другом объекте. Все должно работать, при этом надо не забыть поставить ссылку на объект.
Аватара пользователя
x-mas
UNец
 
Сообщения: 43
Зарегистрирован: 23 фев 2017, 12:51

Re: Где логика?

Сообщение samana 21 июл 2017, 13:42

Тут конечно надо узнать задумку автора, поэтому трудно сейчас определить плюсы и минусы такой частой активации/деактивации. Но всё равно лучше не делать объект прозрачным, лучше отключать ему meshRenderer, если необходимо чтобы скрипты объекта работали при "выключении" видимости.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Где логика?

Сообщение emelian1917 21 июл 2017, 22:07

Оу :) Привет всем! Спасибо за участие!

Да, это был явный глюк редактора. Я перезагрузил и всё стало нормальным.
Задача у меня: получение данных о частоте "мерцания" объекта и смена его цвета в определённый промежуток времени. Чтобы был эффект мерцания с определённой частотой.

Столкнулся с тем, что Time здесь явно не подходит, поскольку платформа на Android и при запуске и снижении FPS мерцание помноженное на DeltaTime явным образом заставляет грустить.
Поэтому использую системный stopwatcher.

Кому интересно:


// пространство имён
using System.Diagnostics;
using System;

// Объявление
Stopwatch GHzTimer = new Stopwatch();
TimeSpan Ghz;

// На старте
void Start () {
GHzTimer.Start();
}

// При обновлении
void FixedUpdate()
{
TimerFrequency(material, frequency, originalColor, color); //(разумеется значения подставлены из предыдущих выключений в других методах, весь код программы слишком длинный, чтобы сюда кидать)
}

void TimerFrequency (Material material, int frequency, Color32 originalColor, Color32 _color)
{
Ghz = GHzTimer.Elapsed;

if (Ghz.Milliseconds >= frequency)
{
if (change == true)
{
change = false; material.color = _color;
UnityEngine.Debug.Log(originalColor);
}
else { change = true; material.color = originalColor; }
}
}
emelian1917
UNец
 
Сообщения: 11
Зарегистрирован: 11 июл 2016, 12:38


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 11