2015-04-02 82 views
2

因此,自4.6版統一使用新的UI系統以來,我從未使用過。到現在。onClick按鈕上的onClick監聽器代理

我想要做的是以動態方式生成按鈕,因此我還必須以動態方式(或至少通過腳本)添加onClick事件。

我tryed延長的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

+0

嗯,你爲什麼要添加Click Listener到新的UI?我只是好奇,因爲它已經有一個onClick監聽器,這完全響應鼠標點擊和觸摸,多觸摸也。與OnGui不同,您不必在開始時添加Listner或IF條件。 你甚至可以對任何腳本製作一個公共方法並打開ButtonObject的OnClick組件,並使用其上的公共方法拖動該遊戲對象,然後在下拉列表中選擇該方法,以便將其引發。 – Aizen 2015-04-02 21:49:42

+0

你的意思是在某些時候,你想要將一個GameObject拖到新UI的onClick上,並嘗試從那裏訪問腳本?我明白你想動態地做到這一點,我很好奇,因爲我從來沒有這樣做過。 – Aizen 2015-04-02 21:52:47

+0

@Aizen想象一下你有一個'List <>',其中某些值在應用程序運行後可以有更多的值。通過這個循環遍歷這個列表,併爲每個值生成一個'Button'。這全部由代碼生成,因此我不能使用統一的GUI並將GameObject拖到onClick事件中。 – nkmol 2015-04-03 12:57:36

回答

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

Up。很酷,這種方法有什麼缺點? newButton從哪裏來?你有沒有新的Button類型,然後GetComponent?之後,再添加命名空間的另一個btn然後分配newButton? 所以你需要至少做2聲明這個工作正確嗎? – Aizen 2015-04-08 00:09:09

+0

我只是做了一個按鈕的預製,從資源加載它,實例化它,並添加了所需的配置。在更新時添加了代碼。 – nkmol 2015-04-08 10:52:58

0

如何通過拉姆達作爲代表?

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

lambda已被用作匿名方法,與使用委託相同,但在這種情況下更短。 – nkmol 2015-04-03 12:55:52

0

下面一行應該可以正常工作。

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

問題在於placeBuilding(obj.name);,確保它在lambda之外工作。請諮詢this page

2

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

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。僅供參考,您還可以添加拖動或您可能需要的任何界面。

然後只是和方法接口。 RightClick IPinterClickHandler然後選擇實現接口來檢查它有什麼其他方法。

您需要將其附加到gameObject。任何GameObject。包括按鈕。

如此動態地在您的按鈕列表中,要麼將其添加爲組件。 AddComponent();我打電話給我的班級MainLab出於測試目的。

+0

感謝您的評論,儘管它適用於我的示例,但它不像我想要的那樣充滿活力。它需要一個新的類,並在onClick事件中使用不同的方法,這將需要在每個不同的按鈕上添加不同的PointerClass。 – nkmol 2015-04-07 10:59:29