Понедельник, 23 Декабря 2024, 22:46

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Проблема с destroy или setactive при вторичной инициализации
AstralangelДата: Суббота, 29 Августа 2015, 18:53 | Сообщение # 1
STF Games
Сейчас нет на сайте
Добрый день. Есть проблема необычного характера. Имеем префаб, который при определенных событиях совершает instantiate.
И далее, после его появлении на сцене происходит поиск параметров префаба, ненужные отсекаются, а остальные отображаются:

Код

if (current == 1) {
       GameObject.FindWithTag ("stupa2").SetActive (false);
       GameObject.FindWithTag ("stupa3").SetActive (false);
}
if (current == 2) {
       GameObject.FindWithTag ("stupa1").SetActive (false);
       GameObject.FindWithTag ("stupa3").SetActive (false);
}


Здесь сам префаб состоит из трех частей stupa1, stupa2, stupa3, если переменная current == 1, то первый (stupa1), видно по-умолчанию, остальные скрываются, если == 2 первый должен скрыться (или удалиться при вызове Destroy), второй отобразиться, а третий также скрыться.
НО. Вся беда в том, что если при (current == 1) мы не затрагивали первый объект (stupa1), то при (current == 2) никакие действия с этим объектом не выполняются, ни destroy, ни setactive false, ничего не срабатывает. Гуглил, читал, смотрел, переписывал, результат всегда один, если объект остался Setactive == true при предыдущем вызове префаба, то на его клон не распространяются никакие действия при следующем значении current. При этом предыдущий префаб удаляется со сцены, и только после его удаления появляется клон и вновь проходит по скрипту фильтрации параметров.

Буду очень рад идеям или прямым указаниям по экзорцизму этой твари из моего кода.


Весь мир театр, все люди в нем актеры и каждый не одну играет роль (с) Шекспир

Сообщение отредактировал Astralangel - Суббота, 29 Августа 2015, 19:06
berilДата: Суббота, 29 Августа 2015, 22:29 | Сообщение # 2
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Destroy идет перед этим кодом или после? Можно весь код скрипта?
Ну и лучше будет
Код
if {}
{}
else if()
{}




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
seamanДата: Суббота, 29 Августа 2015, 23:00 | Сообщение # 3
старожил
Сейчас нет на сайте
Ваши объяснения абсолютно непонятны.
1. "префаб, который при определенных событиях совершает instantiate" - префаб НЕ может делать никаких действий. Рантайм Вы можете из префаба создать объект
2. "происходит поиск параметров префаба" - Нельзя рантайм что-то искать в префабе.
3. "при предыдущем вызове префаба" - Что значит "вызов префаба"? По префабу можно инстанцировать объект, вызвать его нельзя.
4. "предыдущий префаб удаляется со сцены" - На сцене нет вообще никаких префабов. Просто их там НЕТ! Там есть только объекты.
________
Могу пованговать - как я понял Вашу проблему.
Вы создаете объект из префаба.
После создания проверяете некий параметр current и на его основе в созданном объекте отключаете части.
Создаете второй объект из того же префаба.
У второго объекта почему то не отключаются части - в этом Ваша проблема.
Верно, или я Вас не понял?


Сообщение отредактировал seaman - Суббота, 29 Августа 2015, 23:02
AstralangelДата: Вторник, 01 Сентября 2015, 12:45 | Сообщение # 4
STF Games
Сейчас нет на сайте
Цитата beril ()
if {}
{}
else if()
{}

Пробовал и так и сяк. Не срабатывает. Весь код смогу показать вечером.

Цитата seaman ()
Ваши объяснения абсолютно непонятны.

Переименуйте слово prefab в объект, станет более понятно.

Цитата seaman ()
Верно, или я Вас не понял?

В точку. При чем не отключаются только те части, которые были затронуты при инициализации первого объекта из префаба.


Весь мир театр, все люди в нем актеры и каждый не одну играет роль (с) Шекспир

Сообщение отредактировал Astralangel - Вторник, 01 Сентября 2015, 12:46
AstralangelДата: Вторник, 01 Сентября 2015, 12:50 | Сообщение # 5
STF Games
Сейчас нет на сайте
Цитата beril ()
Destroy идет перед этим кодом или после? Можно весь код скрипта?

Там же, вместо setactive
Код
if (current == 1) {   
         GameObject.FindWithTag ("stupa2").SetActive (false);   
         GameObject.FindWithTag ("stupa3").SetActive (false);   
}   
else if (current == 2) {   
         Destroy(GameObject.FindWithTag ("stupa1"));   
         GameObject.FindWithTag ("stupa3").SetActive (false);   
}


Весь мир театр, все люди в нем актеры и каждый не одну играет роль (с) Шекспир

Сообщение отредактировал Astralangel - Вторник, 01 Сентября 2015, 12:50
seamanДата: Вторник, 01 Сентября 2015, 14:32 | Сообщение # 6
старожил
Сейчас нет на сайте
Поскольку я весь код не вижу - советы несколько умозрительны.
1. Я бы проверял current - действительно ли он такой у второго созданного объекта как Вы ожидаете. Причин почему он не такой - масса. Например - current у Вас static и один для всех объектов.
2. Если Вы передаете current в объект при его старте (т.е. он не один - первый пункт исключен) - тогда проверяйте - тому ли объекту Вы его передаете.
3. Возможно мешают какие-то иные скрипты, висящие на тех же объектах.

Вообще в таких случаях необъяснимого поведения лучше всего сделать микропроект, заменив все кубиками, в котором повторяется глюк. И проект выложить, чтобы мы посмотрели и возможно что-то посоветовали более предметно.
  • Страница 1 из 1
  • 1
Поиск:

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