Четверг, 14 Ноября 2024, 10:29

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Проблема с List C#
purple_rioДата: Понедельник, 22 Января 2018, 17:09 | Сообщение # 1
был не раз
Сейчас нет на сайте
Общее. На сцене есть два объекта (cube), у которых по два дочерних canvas (далее холсты).



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

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



По необходимости я уничтожаю любой из этих объектов(cube), а т.к. с уничтожением объекта уничтожаются и все его дочерние объекты (то есть холсты), то ссылки на эти холсты в List пропадают.



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

Цитата
MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.


Искал в интернете способы обновить List, чтобы убрать "битые" ссылки. Люди выкладывали свои примеры, которые я пробовал:




С помощью этих методов List обновляется.



Но вот при нажатии кнопки все также выдает ошибку и холсты не заменяются между собой. Так же очищал List полностью и заново заносил в него по тэгу оставшиеся холсты, но раз холсты у меня меняются между собой по нажатию кнопки, то один всегда неактивен, и его не заносит в List.



После очистки List и добавления в него же, по нажатию на кнопку ошибка не появляется.

Прошу помощи в исправлении этой ошибки. Возможно кто-то знает как правильно пересобрать List, либо ссылку на ресурс, где эту ошибку исправляли. Подскажите, в какую сторону копать. Просто мне в голову лезет написание только такого "говнокода".

Вот мой "говнокод".



Может быть кто-то уже делал такое и может помочь мне в этом вопросе, когда на сцене много объектов, и у всех сразу можно просматривать информацию по нажатию на одну кнопку и эти объекты могут быть уничтожены или добавлены во время игры на сцену.

P.S. заранее извиняюсь, если весь текст вышел непонятным.


Сообщение отредактировал purple_rio - Понедельник, 22 Января 2018, 17:12
defGMDefeloperДата: Понедельник, 22 Января 2018, 17:16 | Сообщение # 2
частый гость
Сейчас нет на сайте
Зачем 2 холста?сделай 1 и повесь на него синий и оранжевый UI
в лист записывай не канвас ,а игровой обьект(куб).Ну хотя смотри как лучше.

Цитата
По необходимости я уничтожаю любой из этих объектов

Это где ты его удаляешь?
Вот там где удаляешь пишешь
constractUI.Remove(cube)
Destroy(cube)

А вообще объясни зачем это все?


Сообщение отредактировал defGMDefeloper - Понедельник, 22 Января 2018, 17:17
purple_rioДата: Понедельник, 22 Января 2018, 17:31 | Сообщение # 3
был не раз
Сейчас нет на сайте
defGMDefeloper, Да это понятно, что можно использовать один холст, в котором будут сразу и синий и оранжевый UI. Просто пока для теста сделал два холста.

Цитата
А вообще объясни зачем это все?


Чтобы менять главный холст на вспомогательный, и наоборот по нажатию кнопки UI, для каждого объекта на сцене. Просто другой способ в голову никак не приходит, как взаимодействовать со всеми холстами на одной сцене сразу одной кнопкой, так, чтобы это все работало с динамически установленными объектами, ну и уничтоженными тоже.
defGMDefeloperДата: Понедельник, 22 Января 2018, 17:49 | Сообщение # 4
частый гость
Сейчас нет на сайте
ну добавляй в list не холсты,а вот эти синие и оранжевые UI-шки,и выключай компонент ,к примеру Image,тогда он не будет отображаться

Добавлено (22 Января 2018, 17:45)
---------------------------------------------
Ещё можно создать 2 камеры и переключать между ними,одна камера рендерит только синий канвас,другая только оранжевый.способов вообще много

Добавлено (22 Января 2018, 17:49)
---------------------------------------------
А конкретней можно?Что ты хочешь получить в конечном результате?Или это ты прост учишся


Сообщение отредактировал defGMDefeloper - Понедельник, 22 Января 2018, 17:49
purple_rioДата: Понедельник, 22 Января 2018, 19:57 | Сообщение # 5
был не раз
Сейчас нет на сайте
defGMDefeloper, хочу получить в конечном итоге возможность создавать и удалять во время игры объекты на сцене, но при этом управлять одной кнопкой холстами всех объектов на сцене. Как-то так.

Твой коммент
Цитата
в лист записывай не канвас ,а игровой обьект(куб)
заставил меня задуматься переписать немного скрипт. До этого даже не задумывался об этом.

Переписал этот скрипт, теперь в List записываю только объекты(cube), и уже дочерними холстами управляю. Теперь не нужно искать по тэгу холсты, из-за чего неактивные холсты не записывались в List.

Пересобирать List так и не получается. Все так же выдает ошибку, но можно будет полностью очистить List и заново добавить в него активные объекты. Что при предыдущем скрипте мне не позволяло делать поиск по тэгу.
Еще заметил, что если объект(cube) просто выключить на сцене, то ошибку не выдает (что логично) и все работает. Тогда можно будет подключить Object Pool.

Теперь немного легче с этим скриптом, но и есть ещё над чем подумать.

Сам "говноскрипт"



Сообщение отредактировал purple_rio - Понедельник, 22 Января 2018, 20:00
defGMDefeloperДата: Понедельник, 22 Января 2018, 20:14 | Сообщение # 6
частый гость
Сейчас нет на сайте
Ну тут лучше всего сделать как я предлагал второй вариант

Делаешь 2 слоя MainBtn и Info
и делаешь2 камеры

Одна показывает все слои кроме MainBtn
Друга все кроме Info
и переключаешь их между собой.Это быстрее чем перебирать все кубики и искать к ним дочерние объекты это раз и это само собой проще это два)

GameObject[] cameras;

void _Swich()
{
cameras[0].SetActive(!cameras[0].activeself);
cameras[1].SetActive(!cameras[1].activeself);
}
//типа так
А передвигать нужно их одновременно.Так что просто двигаешь одну камеру ,а второй задаешь координаты первой вот и вся любовь.
Ну а если это слишком некрасивый код сделай цилком :)
for(int i =0;i<cameras.Length;i++) cameras[i].SetActive(!cameras[i].aself);


Сообщение отредактировал defGMDefeloper - Понедельник, 22 Января 2018, 20:22
  • Страница 1 из 1
  • 1
Поиск:

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