События onPlick AddPersistentListener не являются постоянными - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть массив с чем-то вроде 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);

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...