UI按钮上的onClick侦听器委派

时间:2015-04-02 13:56:38

标签: c# unity3d listener unityscript delegation

因为4.6 unity使用了一个新的UI系统,我从未使用过。到现在为止。

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

我试图扩展onClick Listener,但它并不想工作:

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

4 个答案:

答案 0 :(得分:3)

我有一些工作,可能适合您的需求。

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,然后选择“实现接口”以检查它具有的其他方法。

您需要将此附加到gameObject。任何GameObject。包括按钮。

动态地在您的按钮列表中,您要将其添加为组件。 AddComponent();我将我的班级称为MainLab用于测试目的。

答案 1 :(得分:1)

我遇到的问题是我的Button与我称为Button.cs的自定义类冲突。现在我已经学会了不使用已经存在于环境中的类名^^

使用指向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));

此代码位于循环

答案 2 :(得分:0)

如何将Lambda作为委托传递?

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

答案 3 :(得分:0)

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

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

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