| 
				
				Привязывание кнопки с onClick методом к новому объекту
				 | 
 | 
| SrJeonny | Дата: Суббота, 03 Марта 2018, 00:56 | Сообщение # 1 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Работаю с инвентарем, цикл for не использую. Когда беру предмет он удаляется и в инвентаре (ui) создается слот с иконкой, именем и кнопкой. Кнопка имеет метод onClick прописанный через скрипт. Метод удаления из инвентаря и здесь возникла проблема. Создаю слот в инвентаре, создаю кнопку и даю ей в parent'ы свежесозданный слот, по идее после нажатия кнопки должен удалится слот, который её родитель и она сама соответственно (ну и там предмет на сцене потом появится и до этого я еще не дошел). НО если я беру второй предмет в инвентарь то всё ломается : нажимая на кнопку удаления в первом слоте инвентаря удаляется второй (или третий, вообщем последний созданный) и если я жму кнопку в еще одном слоте вылазит ошибка, мол "Кнопка уже удалена, че ты её тыкаешь?". Код:
 Код  public void InventoryAct (GameObject itembox) { // itembox - предмет, попавший из луч из другого скрипта, а этот войд из интерфейса      Item item = itembox.GetComponent<Item> ();   items.Add (item.prefab); // тут не важно
     itemInvName = itembox.name;    Destroy (itembox);    invItem = Instantiate<GameObject> (slot, content.transform);    invItem.GetComponentInChildren<Text> ().text = itemInvName; // магия началась    invItem.transform.Find ("SlotTexture").gameObject.GetComponent<Image> ().sprite = item.icon;    rtransform = invItem.GetComponent<RectTransform> ();    rtransform.anchoredPosition = new Vector2 (128f, offset);    offset -= 61; // магия закончилась    rbutton = Instantiate<GameObject> (removeButton, invItem.transform); //создание кнопки (removebutton - публичный ГО-префаб)    Debug.Log (rbutton.transform.parent.gameObject.name);    btn = rbutton.GetComponent<Button> ();    btn.onClick.AddListener (() => InventoryRemove (invItem, rbutton, rtransform));   }
      void InventoryRemove (GameObject invItem,GameObject rbutton, RectTransform rtransform) {   Destroy (btn.transform.parent.gameObject); // удаляет своего родителя ( и себя заодно)                    // тут будут еще строки после решения проблемы с кнопкой     }
 
  Не понимаю в чем проблема, код можно не модернизировать, прошу лишь логической помощи и наводок. Спасибо.
 
 Сообщение отредактировал SrJeonny - Суббота, 03 Марта 2018, 00:57  |  
| 
 | 
 |    | 
| drcrack | Дата: Суббота, 03 Марта 2018, 01:39 | Сообщение # 2 |  
| 
 старожил 
Сейчас нет на сайте 
 
 | Код  void InventoryRemove (GameObject invItem,GameObject rbutton, RectTransform rtransform) {   Destroy (btn.transform.parent.gameObject); }
  Ты не используешь ни один параметр, а удаляешь btn, который видимо поле класса и ты его присваиваешь в методе выше, поэтому и удаляется последнний добавленный предмет Поставь Resharper  
 
 Сообщение отредактировал drcrack - Суббота, 03 Марта 2018, 01:40  |  
| 
 | 
 |    | 
| SrJeonny | Дата: Суббота, 03 Марта 2018, 02:05 | Сообщение # 3 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Цитата drcrack (  )   Ты не используешь ни один параметр, а удаляешь btn, который видимо поле класса и ты его присваиваешь в методе выше, поэтому и удаляется последнний добавленный предмет  Я на самом деле и rbutton туда ставил, результат тот же
 |  
| 
 | 
 |    | 
| drcrack | Дата: Суббота, 03 Марта 2018, 02:44 | Сообщение # 4 |  
| 
 старожил 
Сейчас нет на сайте 
 
 | Так rbutton тоже поле, какая разница) У тебя оно всегда указывает на последний добавленный предмет
 Код rbutton = Instantiate(  поменяй на
 Код var rbutton = Instantiate(  и в InventoryRemove используй rbutton
 
 Сообщение отредактировал drcrack - Суббота, 03 Марта 2018, 02:46  |  
| 
 | 
 |    | 
| SrJeonny | Дата: Суббота, 03 Марта 2018, 06:01 | Сообщение # 5 |  
| 
 был не раз 
Сейчас нет на сайте 
 
 | Цитата drcrack (  )   поменяй на  Всё работает. Спасибо большое!
 |  
| 
 | 
 |    |