Как сделать событие с параметром на кнопку через скрипт

Столкнулся с такой проблемой.

Есть список кнопок созданных инстантиэйтом из префаба. Нужно так же скриптом присвоить им событие на клик, в которое передать индекс кнопки.

Я пробовал в цикле создания, к кнопке в onClick делать AddListener с методом, но просто так передать туда индекс как аргумент оно не дает. Пишет не удаётся преобразовать void в UnityAction.

Я нашёл где то как сделать это с помощью делегатов (в них не шарю). Сейчас я делаю вот это...

for (int i = 0; i < count; i++)
{  
   Items[i].SelectB.onClick.AddListener(
      delegate { DoSomething(i); });
}

И в DoSomething просто дебаг лог с выводом индекса. Но при нажатии на любую кнопку выводится только ма симальный индекс +1, тоесть значение count.

Как это исправить или как правильно сделать событие на кнопках с их индексом в параметре?


Ответы (1 шт):

Автор решения: Yaroslav

А не проще на префаб с кнопкой повесить скрипт подписанный на событие этой кнопки и возвращающий событие с тем что ты ему укажешь?

public class OnClickObjectCallback : MonoBehaviour
{
    public event Action<GameObject> OnPerform;
    public GameObject Target;

    public void OnClick ()
    {
        if (Target != null && OnPerform != null)
            OnPerform.Invoke(Target);
    }
}

public class Foo : MonoBehaviour
{
    [SerializeField] private GameObject[] _targets;
    [SerializeField] private OnClickObjectCallback _buttonTemplate;

    private void Start ()
    {
        foreach (var target in _targets)
        {
            var btn = Instantiate(_buttonTemplate);
            btn.Target = target;
            btn.OnPerform += Spawn;
        }
    }

    private void Spawn (GameObject target)
    {
        Instantiate(target);
    }
}

Подобный скрипт может даже не просто быть калбеком, а принимать модель типа ScriptableObject содержащую иконку, имя, ссылку на префаб, меняет картинку и текст кнопки при указании модели... логично.

→ Ссылка