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));
这段代码在一个循环中
所以自从 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));
这段代码在一个循环中