我有一个数组,其中包含大约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);
}
}