Суббота, 28 Декабря 2024, 20:54

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Привязывание кнопки с 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 :D


Сообщение отредактировал 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 ()
поменяй на

Всё работает. Спасибо большое!
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг