Помогите разобраться с AddListener

Общие вопросы о Unity3D

Помогите разобраться с AddListener

Сообщение Rayzor 22 апр 2023, 15:59

Добрый день, помогите пожалуйста разобраться.
У меня должны создаваться кнопки, которые делают активными объекты, при проходе цикла все создается, но в OnClick записывается только последний. т.е. со всех кнопок включается только один объект, а все остальные ничего не делают, кто знает в чем может быть дело?
Синтаксис:
Используется csharp
for (int i = 0; i < Applications.Count; i++)
        {
            if (Applications[i])
            {
                Applications[i] = Instantiate(Applications[i-1], Apps.transform, false);
                Applications[i].SetActive(false);
                Icons[i] = Instantiate(IconPrefab, OIcons.transform, false);
                Icons[i].transform.GetChild(0).GetComponent<Text>().text = Applications[i].name;
                Icons[i].GetComponent<Button>().onClick.AddListener(() => { Applications[i].SetActive(true); });
            }
        }
 
Rayzor
UNец
 
Сообщения: 10
Зарегистрирован: 20 апр 2023, 23:41

Re: Помогите разобраться с AddListener

Сообщение waruiyume 22 апр 2023, 16:17

Запишите i в локальную переменную.
https://metanit.com/sharp/tutorial/3.54.php
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Помогите разобраться с AddListener

Сообщение Rayzor 22 апр 2023, 16:56

waruiyume писал(а):Запишите i в локальную переменную.
https://metanit.com/sharp/tutorial/3.54.php


пробовал, тогда при каждом нажатие меняется включаем объект
(т.е. если 2 объекта, но нажимать только на одну кнопку, то он сначала вызовет 1, потом 2, а на третье нажатие выходит за список)
Rayzor
UNец
 
Сообщения: 10
Зарегистрирован: 20 апр 2023, 23:41

Re: Помогите разобраться с AddListener

Сообщение 1max1 22 апр 2023, 18:07

Я вообще не понимаю что делает этот код, вот это что? Applications[i-1] У тебя если i будет 0 сразу дропнет ошибку.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Помогите разобраться с AddListener

Сообщение Rayzor 22 апр 2023, 21:28

1max1 писал(а):Я вообще не понимаю что делает этот код, вот это что? Applications[i-1] У тебя если i будет 0 сразу дропнет ошибку.


Не дропнет ошибку, потому что к кнопке привязывается только последний объект. то есть, если размер списка 4 элемента, то он будет пытаться привязывать элемент под 4 индексом, которого нет, поэтому i -1, иначе он и дропает ошибку. Вопрос в том, почему он привязывает ко всем кнопкам один объект
Rayzor
UNец
 
Сообщения: 10
Зарегистрирован: 20 апр 2023, 23:41

Re: Помогите разобраться с AddListener

Сообщение Alkos26Rus 22 апр 2023, 22:49

Как то тебе люди пишут твои ошибки, ты все равно за свое).

Это почему так? Зачем префаб переназначаешь как созданный объект? В чем логика еще и не под тем индексом?
Applications[i] = Instantiate(Applications[i-1]



пробовал, тогда при каждом нажатие меняется включаем объект

Скинуть код нужно, потому как не факт что ты делал это правильно
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Помогите разобраться с AddListener

Сообщение Rayzor 22 апр 2023, 23:29

Alkos26Rus писал(а):Как то тебе люди пишут твои ошибки, ты все равно за свое).

Это почему так? Зачем префаб переназначаешь как созданный объект? В чем логика еще и не под тем индексом?
Applications[i] = Instantiate(Applications[i-1]



пробовал, тогда при каждом нажатие меняется включаем объект

Скинуть код нужно, потому как не факт что ты делал это правильно


(Applications[i] = Instantiate(Applications[i-1] - эту строчку я просто изначально не правильно сюда заполнил имелось ввиду: Icons[i].GetComponent<Button>().onClick.AddListener(() => { Applications[i-1].SetActive(true); });)
Ну я стараюсь понять, просто кажется, что меня не до конца поняли(

переназначиваю его, потому что Instantiate создает копию объекта, так как эти объекты не размещены, а как по другому сделать это не знаю. А под индексом не тем потому что, по не известной мне причине, при переборе цикла все назначается исходя от i, но в AddListener на кнопки вешается только объект с индексом размера списка, из-за чего вылезает ошибка, что вышел за границы
(То есть при 4 объектах, он присваивает всем кнопкам Applications[4], а объекта с таким индексом нет, вот поэтому я пытаюсь выяснить что не так)

Синтаксис:
Используется csharp
public List<GameObject> Applications = new();
public List<GameObject> Icons = new();

 private void Start()
    {
      for (int i = 0; i < Applications.Count; i++)
        {
            if (Applications[i])
            {
                Applications[i] = Instantiate(Applications[i], Apps.transform, false);
                Applications[i].SetActive(false);
                Icons[i] = Instantiate(IconPrefab, OIcons.transform, false);
                Icons[i].transform.GetChild(0).GetComponent<Text>().text = Applications[i].name;
                Icons[i].GetComponent<Button>().onClick.AddListener(() => { Applications[i].SetActive(true); });
            }
        }
    }

 


Вот часть кода, префабы в лист добавляются через инспектор
Rayzor
UNец
 
Сообщения: 10
Зарегистрирован: 20 апр 2023, 23:41

Re: Помогите разобраться с AddListener

Сообщение Saltant 23 апр 2023, 00:27

Чет у тебя какая то странная логика, ты одинаковые прифабы добавляешь в лист через инспектор?
Просто добавь ссылку на прифаб в скрипт, создавай в цикле столько клонов скока нужно этих прифабов (можешь их в лист кидать сразу).
Если нужно подписать у прибафа в кнопке какой то метод, как по мне правильней на сам прибаф кидать скрипт типа какой нить ButtonHandler где в методе Start ты возьмешь баттон этого прифаба, и подпишешь на нужный тебе метод или же прям в хендлере этот метод и опиши (тогда его можно будет присвоить в прифабе прям через инспектор).
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Помогите разобраться с AddListener

Сообщение 1max1 23 апр 2023, 00:54

Ты так и не сделал самое главное в этой теме.
Запишите i в локальную переменную.

Синтаксис:
Используется csharp
public List<GameObject> Applications = new();
public List<GameObject> Icons = new();

 private void Start()
    {
      for (int i = 0; i < Applications.Count; i++)
        {
            if (Applications[i])
            {
                Applications[i] = Instantiate(Applications[i], Apps.transform, false);
                Applications[i].SetActive(false);
                Icons[i] = Instantiate(IconPrefab, OIcons.transform, false);
                Icons[i].transform.GetChild(0).GetComponent<Text>().text = Applications[i].name;

                int j = i;
                Icons[j].GetComponent<Button>().onClick.AddListener(() => { Applications[j].SetActive(true); });
            }
        }
    }

 
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Помогите разобраться с AddListener

Сообщение Rayzor 23 апр 2023, 09:58

1max1 писал(а):Ты так и не сделал самое главное в этой теме.
Запишите i в локальную переменную.

Синтаксис:
Используется csharp
public List<GameObject> Applications = new();
public List<GameObject> Icons = new();

 private void Start()
    {
      for (int i = 0; i < Applications.Count; i++)
        {
            if (Applications[i])
            {
                Applications[i] = Instantiate(Applications[i], Apps.transform, false);
                Applications[i].SetActive(false);
                Icons[i] = Instantiate(IconPrefab, OIcons.transform, false);
                Icons[i].transform.GetChild(0).GetComponent<Text>().text = Applications[i].name;

                int j = i;
                Icons[j].GetComponent<Button>().onClick.AddListener(() => { Applications[j].SetActive(true); });
            }
        }
    }

 


Какой раз выручаешь, спасибо большое, заработало)
Rayzor
UNец
 
Сообщения: 10
Зарегистрирован: 20 апр 2023, 23:41

Re: Помогите разобраться с AddListener

Сообщение 1max1 23 апр 2023, 10:51

Забавно что ответ был в первом же ответе темы)
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Общие вопросы

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

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