У меня есть массив с чем-то вроде 100 кнопок, к каждой из которых нужно добавить событие OnClick, которое ссылается на другое, зеркальное отображение, 100 объектов. Конечно, я мог сделать это вручную, но вместо этого я попытался создать сценарий редактора, который бы сделал это для меня. Я столкнулся с несколькими проблемами:
1) onClick.AddListener не работает. Он создает только пустой вызов onClick. Это мой код для этого:
leds[i].onClick.AddListener(delegate { AddClickEvent(ledsCopy[i]); });
2) Я пытался использовать UnityEventTools, создавая UnityAction и просто используя AddPersistentListener (Object и Bool):
UnityEventTools.AddBoolPersistentListener(leds[i].onClick, ledsCopy[i].SetActive, true);
С UnityAction:
UnityAction<GameObject> callback = new UnityAction<GameObject>(AddClickEvent);
UnityEditor.Events.UnityEventTools.AddObjectPersistentListener<GameObject>(leds[i].onClick, callback, ledsCopy[i]);
Метод UnityEventTools и UnityAction «работает», но только в режиме «Редактор». Если я позволю ему исполниться в режиме редактирования, а затем выключу генерирующий скрипт, мои события onClick исчезнут. Если я попытаюсь собрать мою игру с этим сценарием, она либо не будет создаваться из-за сценариев редактора, либо игнорирует их, поэтому мои кнопки не будут иметь событий onClick.
Мне не удалось найти ничего похожего на то, что я испытываю, и нет документации о том, что это ожидаемое поведение AddPersistentListener или нет. Я также впервые использую сценарии редактора, поэтому, если я делаю что-то не так или есть другой способ сделать это, пожалуйста, сообщите мне! Спасибо за вашу помощь.
РЕДАКТИРОВАТЬ: полный сценарий, как просили
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor.Events;
#endif
//#if UNITY_EDITOR
[ExecuteInEditMode]
public class SetButtonEvents : MonoBehaviour
{
public Button[] leds = new Button[64];
public GameObject[] ledsCopy = new GameObject[64];
void Start()
{
for (int i = 0; i < leds.Length; i++)
{
leds[i] = transform.GetChild(0).GetChild(i).GetComponent<Button>();
ledsCopy[i] = transform.GetChild(1).GetChild(i).GetChild(0).gameObject;
}
for (int i = 0; i < leds.Length; i++)
{
//UnityAction<GameObject> callback = new UnityAction<GameObject>(AddClickEvent);
// UnityEditor.Events.UnityEventTools.AddObjectPersistentListener<GameObject>(leds[i].onClick, callback, ledsCopy[i]);
//UnityEditor.Events.UnityEventTools.AddObjectPersistentListener<GameObject>(leds[i].transform.GetChild(0).GetComponent<Button>().onClick, callback, ledsCopy[i]);
#if UNITY_EDITOR
UnityEventTools.AddBoolPersistentListener(leds[i].onClick, ledsCopy[i].SetActive, true);
UnityEventTools.AddBoolPersistentListener(leds[i].transform.GetChild(0).GetComponent<Button>().onClick, ledsCopy[i].SetActive, false);
#else
leds[i].onClick.AddListener(delegate { AddClickEvent(ledsCopy[i]); });
leds[i].transform.GetChild(0).GetComponent<Button>().onClick.AddListener(delegate { AddClickEvent(ledsCopy[i]); });
#endif
}
}
void AddClickEvent(GameObject objectToActivate)
{
if (objectToActivate.activeSelf)
objectToActivate.SetActive(false);
else
objectToActivate.SetActive(true);
}
}