UI 按钮上的 onClick 侦听器委托

问题描述 投票:0回答:4

所以自从 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
,因为它似乎是呼叫所需的类型。

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

c# unity-game-engine listener delegation
4个回答
3
投票

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

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

public class MainLab : MonoBehaviour, IPointerClickHandler {

    public void OnPointerClick(PointerEventData eventData)
    {
        Debug.Log("Hello");
    }
}

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

然后就和方法接口了。右键单击 IPinterClickHandler 然后选择 Implement Interface 以检查它还有哪些其他方法。

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

因此,您可以动态地在按钮列表中将其添加为组件。添加组件(); 我将我的班级称为 MainLab 以进行测试。


1
投票

我面临的问题是我的

Button
与我制作的名为
Button.cs
的自定义类冲突。现在我学会了不要使用环境中已经存在的类名^^

使用类的直接路径修复了它:

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

此代码位于循环内


0
投票

将 Lambda 作为委托传递怎么样?

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

0
投票

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

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

问题出在

placeBuilding(obj.name);
,确保它在 lambda 之外工作。请参阅此页面

© www.soinside.com 2019 - 2024. All rights reserved.