Как сделать событие с параметром на кнопку через скрипт
Столкнулся с такой проблемой.
Есть список кнопок созданных инстантиэйтом из префаба. Нужно так же скриптом присвоить им событие на клик, в которое передать индекс кнопки.
Я пробовал в цикле создания, к кнопке в onClick делать AddListener с методом, но просто так передать туда индекс как аргумент оно не дает. Пишет не удаётся преобразовать void в UnityAction.
Я нашёл где то как сделать это с помощью делегатов (в них не шарю). Сейчас я делаю вот это...
for (int i = 0; i < count; i++)
{
Items[i].SelectB.onClick.AddListener(
delegate { DoSomething(i); });
}
И в DoSomething просто дебаг лог с выводом индекса. Но при нажатии на любую кнопку выводится только ма симальный индекс +1, тоесть значение count.
Как это исправить или как правильно сделать событие на кнопках с их индексом в параметре?
Ответы (1 шт):
А не проще на префаб с кнопкой повесить скрипт подписанный на событие этой кнопки и возвращающий событие с тем что ты ему укажешь?
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 содержащую иконку, имя, ссылку на префаб, меняет картинку и текст кнопки при указании модели... логично.