Привязывание кнопки с 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 ( ) поменяй на Всё работает. Спасибо большое!
|
|
| |