[英]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.