AddPersistentListener onclick事件不是持久的

时间:2019-04-11 08:47:17

标签: c# unity3d button event-handling

我有一个数组,其中包含大约100个按钮,每个按钮都需要添加一个OnClick事件,该事件引用另一个镜像的100个对象。当然,我可以手动执行此操作,但我尝试创建一个可以为我执行此操作的编辑器脚本。我遇到了几个问题:

1)onClick.AddListener无法正常工作。它只会创建一个空的onClick调用。这是我的代码:

leds[i].onClick.AddListener(delegate { AddClickEvent(ledsCopy[i]); });

2)我试图通过创建UnityAction并仅使用AddPersistentListener(对象和布尔)来使用UnityEventTools:

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);

    }
}

0 个答案:

没有答案