所以自从 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
,因为它似乎是呼叫所需的类型。
感觉我错过了一些非常简单的东西。希望有人能帮助我。
嗯,我有一些工作,可能适合你的需求。
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 以进行测试。
我面临的问题是我的
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));
此代码位于循环内
将 Lambda 作为委托传递怎么样?
btn.GetComponent<Button>().onClick.AddListener(delegate
{
() => { placeBuilding(obj.name); }
});
以下行应该可以正常工作。
btn.GetComponent<Button>().onClick.AddListener(() => { });
问题出在
placeBuilding(obj.name);
,确保它在 lambda 之外工作。请参阅此页面。