Страница 1 из 1

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

СообщениеДобавлено: 07 июл 2020, 14:39
CRAFTYCRAFTZ
Всем привет, у меня появилась неожиданная ошибка - при компиляции метод 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;
}
}

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

СообщениеДобавлено: 07 июл 2020, 15:00
Jarico
Говно код хоть покажи, не эстрасексы же на форуме сидят...

Массив который возвращает FindGameObjectsWithTag кэширован только в редакторе т.к. открыта сцена (чтобы в иерархии не было переопределения объектов) и поэтому массив не копируется из памяти а просто делает ссылку на него (как ArraySegment). Вне редактора иерархии нет поэтому так и происходит. По крайней мере это было на версиях до версии 5.7