UI 按钮上的 onClick 侦听器委派

onClick listener delegation on UI Button

所以自从 4.6 unity 使用新的 UI 系统以来,我从未使用过。直到现在。

我想做的是以动态方式生成按钮,因此我还必须以动态方式(或至少通过脚本编写)添加 onClick 事件。

我已经尝试扩展 onClick 侦听器,但它不想工作:

btn.GetComponent<Button>().onClick.AddListener(() => { placeBuilding(obj.name); });

它会给出这个错误,听起来很清楚哪里出了问题:

Assets/Scripts/Menu/btnBouwen.cs(72,45): error CS0119: Expression denotes a 'method group', where a 'variable', 'value' or 'type' was expected

但是我不知道如何使用 UnityAction,因为它似乎是调用所需的类型。

感觉好像我错过了一些非常简单的东西。希望有人能帮助我。

亲切的问候, Nkmol

作为委托传递 Lambda 怎么样?

btn.GetComponent<Button>().onClick.AddListener(delegate
{
    () => { placeBuilding(obj.name); }
});

以下行应该可以正常工作。

btn.GetComponent<Button>().onClick.AddListener(() => { });

问题出在 placeBuilding(obj.name);,确保它在 lambda 之外工作。咨询 this page.

好吧,我有一些有用的东西,可能适合你的需要。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class MainLab : MonoBehaviour, IPointerClickHandler {

// Use this for initialization




    void Start () {

}



    public void OnPointerClick(PointerEventData eventData)
    {

        Debug.Log("Hello");
    }
}

在此我们添加,UnityEngine.EventSystems然后添加接口 IpointerClickHandler。仅供参考,您还可以添加拖动或您可能想要的任何界面。

然后只是和方法接口。右键单击 IPinterClickHandler 然后选择 Implement Interface 以检查它还有什么其他方法。

您需要将其附加到游戏对象。任何游戏对象。包括按钮。

所以动态地在您的按钮列表中,您想要将其添加为组件。添加组件();我将我的 class MainLab 称为测试目的。

我面临的问题是我的 Button 与我创建的名为 Button.cs 的自定义 class 冲突。现在我学会了不使用环境中已经存在的 Class 个名称^^

用 Class:

的直接路径修复了它
UnityEngine.UI.Button btn = newButton.GetComponent<UnityEngine.UI.Button>();
btn.onClick.RemoveAllListeners(); 
btn.onClick.AddListener(() => placeBuilding(obj.name));

代码:

GameObject button = Resources.Load <GameObject>("Button"); //loading from resource

GameObject newButton = Instantiate(button);
newButton.transform.parent = panel.transform;
newButton.GetComponentInChildren<Text>().text = obj.name;
newButton.transform.position = button.transform.position;
newButton.transform.position += new Vector3(20*x, -70 * z, 0);
UnityEngine.UI.Button btn = newButton.GetComponent<UnityEngine.UI.Button>();
btn.onClick.RemoveAllListeners(); 
btn.onClick.AddListener(() => placeBuilding(obj.name));

这段代码在一个循环中