Проблема с 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 идет перед этим кодом или после? Можно весь код скрипта? Ну и лучше будет
Накодил? Убери за собой! Инвентарь в 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. Возможно мешают какие-то иные скрипты, висящие на тех же объектах.
Вообще в таких случаях необъяснимого поведения лучше всего сделать микропроект, заменив все кубиками, в котором повторяется глюк. И проект выложить, чтобы мы посмотрели и возможно что-то посоветовали более предметно.
|
|
| |