关于unity中AddListener的传参问题的研究

首先在unity中,AddListener方法的是需要一个无参的方法的,但是很多需求导致我们都必须要传递参数,这时候就会和你困难,所以呢我不多比比,直接上最简单的方式:
使用兰姆达表达式
Button.onClick.AddListener(() =>{ SceneManager.LoadScene(name); });
这样确实能满足一定的需要了,但是有时候我们的需求会更诡异,比如我遇到的这个问题:我需要有很多的按钮,但是他们执行的都是跳转场景,只是场景名不一样,大多是人的感觉是这么写:
public List BS = new List();
public List ScenceName = new List();
void OnEnable()
{
for (int i = 0; i < BS.Count; i++)
{ BS[i].onClick.AddListener(()=>{SceneManager.LoadScene(ScenceName[i]); }); }
}
很可惜,这么写一定会报错。。。。。因为兰姆达表达式其实相当于另一个方法了,这个i是传递不过去的。
但是,我们可以这么写:
public List BS = new List();
public List ScenceName = new List();
void OnEnable()
{
for (int i = 0; i < BS.Count; i++)
{int temp = i; BS[i].onClick.AddListener(() =>{ SceneManager.LoadScene(ScenceName[temp]); }); }
}
其实这就是整个临时变量temp来存一哈,涉及到临时变量存在时间的问题,这样写,就能传递过来了。

你可能感兴趣的:(unity)