Среда, 27 Ноября 2024, 11:04

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
как накидывать на кнопку свой Номер массива делегат?
MegaMan11Дата: Суббота, 30 Мая 2020, 22:42 | Сообщение # 1
частый гость
Сейчас нет на сайте
Привет всем! У меня вопрос хочу при создании массива кнопок поставить свой лиснер метод со своим аргументом как это делается?? как только не пытался Вот код
Код
using UnityEngine;
using UnityEngine.UI;

public class AllFromTheEntity : EntityPanel
{
    private Entity entityGO;

    delegate void butDelegate(byte num);

    butDelegate[] butDel = new butDelegate[10];

    public override void SpawnAll()
    {

        entityGO = EnvokeObject.GetComponent<Entity>();
        if (entityGO.ImproveToPref.Count > 1)
        {
     

            {

                foreach (Transform child in GridGenerator.transform)
                {
                    Destroy(child.gameObject);
                }

                byte i = 0;

                foreach (GameObject b in entityGO.ImproveToPref)   /// вызываем  
                {

                    GameObject clone = Instantiate(BuildingButPref, transform.position, transform.rotation);
                    clone.transform.SetParent(GridGenerator.transform);

                    clone.GetComponent<Image>().sprite = BuildingInShopPrefs[i].GetComponent<Entity>().spriteU;
      
                    Debug.Log("i++" + i);

                    //   butDel[i] =  NumTransformane;
                    //    clone.GetComponent<Button>().onClick.AddListener(    delegate { butDel[i]; } );

                    clone.GetComponent<Button>().onClick.AddListener(() => NumTransformane(i));
                    i++;

                }
                byte i = 0;
                foreach (GameObject b in entityGO.skill)   /// вызываем  
                {

                    GameObject clone = Instantiate(BuildingButPref, transform.position, transform.rotation);
                    clone.transform.SetParent(GridGenerator.transform);

                    //   butDel[i] =  NumSkill;
                    //    clone.GetComponent<Button>().onClick.AddListener(    delegate { butDel[i]; } );
                    clone.GetComponent<Image>().sprite = entityGO.skill[i].GetComponent<Entity>().spriteU;
    
                    Debug.Log("i++" + i);
                     
                    clone.GetComponent<Button>().onClick.AddListener(() => NumSkill(i));
                    i++;

                }

            }

        }
    }

    private void GoTransformane(byte num)
    {
        Debug.Log("GoTransformane" + num);
    }

    public void NumSkill(byte num)
    {
        Debug.Log("NumSkill" + num);
    }
     

}


Сообщение отредактировал MegaMan11 - Суббота, 30 Мая 2020, 23:09
shizofrenДата: Воскресенье, 31 Мая 2020, 10:32 | Сообщение # 2
Starting MS-DOS...
Сейчас нет на сайте
MegaMan11, ты всё правильно делаешь. Только у тебя метод называется неправильно, в цикле NumTransformane, а на самом деле GoTransformane.
Но тут ты столкнулся с такой особенностью языка, как замыкание. Когда переменная внешней области видимости byte i замыкается внутри цикла. Для того, чтобы убрать замыкание, тебе надо в каждой итерации создавать отдельную переменную для листенера. типа byte buttonArgument = i, и передавать её в лямбду.


Моя команда
MegaMan11Дата: Воскресенье, 31 Мая 2020, 14:30 | Сообщение # 3
частый гость
Сейчас нет на сайте
shizofren спасибо теперь знаю что такое замыкание
  • Страница 1 из 1
  • 1
Поиск:

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