簡體   English   中英

索引不是我所期望的 C# unity3d

[英]The index not what i expected C# unity3d

我發現腳本上的索引有問題,為什么我的方法 ChooseItem 上的索引變為 1 而不是 0? 這里的腳本

public void AddBtn()
{
    RemoveButton();
    for (int i = 0; i < items.Count; i++)
    {
        indexer = i;
        ShopItem activeOne = items[indexer];
        go = Instantiate(prefabBtn, parentBtn);
        btn = go.GetComponent<_button>();
        btn.indexer = indexer;
        btn.TheItems.sprite = items[indexer].theitem;
        btn.button.onClick.AddListener(() =>chooseItem(indexer));
    }
}

public void chooseItem(int index)
{

    Debug.Log(index);
}

我不知道問題所在,誰能解釋一下為什么? 這里的圖片在此處輸入圖片說明

使用 lambda 時的典型錯誤!

您覆蓋字段值

indexer = i;

然后這一行

btn.button.onClick.AddListener(() =>chooseItem(indexer));

或者更好地說監聽器lambda 表達式

()=>chooseItem(indexer);

使用indexer字段引用而不是當前值延遲/延遲執行! 它將始終使用字段indexer的最新值,如果總共有兩個按鈕,則在您的情況下為1

這稱為捕獲外部變量

Lambda 可以引用外部變量。 這些是在定義 lambda 表達式的方法范圍內或在包含 lambda 表達式的類型范圍內的變量。 以這種方式捕獲的變量會被存儲起來以在 lambda 表達式中使用,即使這些變量會超出范圍並被垃圾收集。

順便說一句,如果您直接使用i也會發生同樣的情況。


您需要做的是將值分配給局部變量並使用該變量代替

var currentIndex = i;

...

btn.button.onClick.AddListener(() =>chooseItem(currentIndex));

或者,如果您無論如何都將值分配給btn.indexer您可能可以直接去

btn.button.onClick.AddListener(() => chooseItem(btn.indexer));

你需要這個代碼:

public void AddBtn()
{
    RemoveButton();
    for (int i = 0; i < items.Count; i++)
    {
        indexer = i;
        ShopItem activeOne = items[indexer];
        go = Instantiate(prefabBtn, parentBtn);
        btn = go.GetComponent<_button>();
        btn.indexer = indexer;
        btn.TheItems.sprite = items[indexer].theitem;
        btn.button.onClick.AddListener(() =>chooseItem(btn));
    }
}

public void chooseItem(_button_ btn)
{

    Debug.Log(btn.indexer);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM