直接上代码
Button btn;
string test = "ta他啊";
int temp = 99;
private void Awake()
{
btn = transform.GetComponent<Button>();
}
private void Start()
{
btn.onClick.AddListener(delegate { Debug.Log("string值:"+test+"int值:"+temp); });
StartCoroutine(Test());
}
IEnumerator Test()
{
yield return new WaitForSeconds(5f);
test = "她";
temp = 1024;
}
结果
string值:ta他啊int值:99
string值:她int值:1024
结论
委托是封装一个方法,这个方法里面所有的变量其实都是传的地址,而不是值,这也就说明了为什么当你去循环注册button时会出现数组越界
比如一个for循环 i<5, 意思就是i=5的时候跳出循环
你的i传到委托里,其实传地址进去而不是一个值,当循环结束,i的值也就变成了5,点击事件当然会出现数组越界的错误。有些人循环注册事件老是最后一个值也是这个原因
解决方法就是直接再声明一个变量int temp=i,把temp传进委托里,因为temp仅仅是保留了i的值。