Некорректная работа GameObject.FindGameObjectsWithTag

Ошибки и баги Unity3D

Некорректная работа GameObject.FindGameObjectsWithTag

Сообщение CRAFTYCRAFTZ 07 июл 2020, 14:39

Всем привет, у меня появилась неожиданная ошибка - при компиляции метод FindGameObjectsWithTag работает некорректно, при запуске игры через игры все работает хорошо, метод находит объекты по порядку и кладет в список, но при компиляции игры метод находит объекты не по порядку, проведя тесты я понял что он ищет не по порядку сверху вниз, а по какому-то другому признаку, возможно по дате создания, вобщем у меня есть менюшка для игры, там 3 кнопки и 3 панельки с другими кнопками, каждая кнопка имеет параметр - свой индекс, по которому юнити определяет какую панель включать, панели и кнопки находятся в упорядоченном списке, то есть 1-ая кнопка 1-ая в списке, а первая панель первая в списке и тд, в первой кнопке стоит индекс 0 как параметр, и при нажатии включает панель с индексом 0 и кнопку с 0 индексом, а как мы знаем они находятся первыми в списке, а значит всё работает, НО при компиляции порядочность списка изменяется по неизвестной причине, можно прикрепить всё вручную, но всё-таки почему метод FindGameObjectsWithTag работает некорректно и в неизвестном порядке располагает найденные элементы?

По запросу вот говнокод для переключения панелек по нажатию кнопки, то что закомменчено должно работать:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class MenuButtons : MonoBehaviour
{
public GameObject[] buttonList;
public GameObject[] panelList;
public Sprite selectedMode;
public Sprite unselectedMode;

public void Awake()
{
//buttonList = GameObject.FindGameObjectsWithTag("MenuButtons");
//panelList = GameObject.FindGameObjectsWithTag("MenuPanel");
}

public void Start()
{
foreach (GameObject panel in panelList)
{
panel.SetActive(false);
}

panelList[0].SetActive(true);
foreach (GameObject button in buttonList)
{
button.GetComponent<Image>().sprite = unselectedMode;
}
buttonList[0].GetComponent<Image>().sprite = selectedMode;
}

public void OpenPanel(int number)
{
foreach (GameObject panel in panelList)
{
panel.SetActive(false);
}
panelList[number].SetActive(true);
foreach (GameObject button in buttonList)
{
button.GetComponent<Image>().sprite = unselectedMode;
}
buttonList[number].GetComponent<Image>().sprite = selectedMode;
}
}
Последний раз редактировалось CRAFTYCRAFTZ 07 июл 2020, 15:44, всего редактировалось 1 раз.
CRAFTYCRAFTZ
UNец
 
Сообщения: 1
Зарегистрирован: 07 июл 2020, 14:28

Re: Некорректная работа GameObject.FindGameObjectsWithTag

Сообщение Jarico 07 июл 2020, 15:00

Говно код хоть покажи, не эстрасексы же на форуме сидят...

Массив который возвращает FindGameObjectsWithTag кэширован только в редакторе т.к. открыта сцена (чтобы в иерархии не было переопределения объектов) и поэтому массив не копируется из памяти а просто делает ссылку на него (как ArraySegment). Вне редактора иерархии нет поэтому так и происходит. По крайней мере это было на версиях до версии 5.7
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт


Вернуться в Глюки

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0