小白一枚,求教大佬
最近在学习UGUI控件,我发现如果button.onClick.AddListener()在Update()中使用,当点击一下鼠标就会出现AddListener()的 匿名方法参数被多次调用的情况,而在Start()或者Awake()中就不会出现这个问题。
想请教一下,AddListener()这个方法只能在Start()或者Awake()中使用吗?但这两个函数不是在项目运行中只执行一次吗?
AddListener是在监听列表里面添加一个监听的委托,放在update里面会导致重复添加,相当于List.Add在Update当中的效果。使用AddListener注册了监听以后,程序满足了OnClick条件时就会自动调用这个事件。委托是在程序外一直等待,直到满足条件执行(想象协程的感觉,协程也只需要在start调用一次。相当于委托自己开了一个线程等待,如果放在update里面就会无限注册委托导致程序崩溃)。所以只需要在start或awake当中注册一次就可以了。update里由于重复添加监听很多遍,就会重复调用该委托。
AddListener()可以放在任何地方,但是一般放在start里,因为它只需要执行1次。不是说它只执行一次,而是说你要只调用1次。如果你调用了多次,它就会执行多次,但是这会导致事件被重复添加,就不对了。
.AddListener是注册的意思 例如:btnArr[index].onClick.AddListener(ClickCall); 把ClickCall方法注册到点击事件里, 多次点击就对多次调用ClickCall方法, 但只需注册一次
AddListener是给按钮添加点击事件,而不是像ngui那样给点击事件赋值,区别就是AddListener调用一次,添加一次,添加了多少次,点击下就会执行多少次方法。所以不能放在update里面。而ngui是用“=”赋值,不管你赋值多少次,都只有只有一个值。不过按钮添加事件这些都是要写到start或者awake里面,不会放到update。
Add是添加,这是添加了一个监听,而你后面用到事件触发,是这个监听在工作
AddListener注册监听事件,监听事件是你鼠标点击按钮会触发的事件,当你点击的那个按钮,它就会去触发你注册好的事件,事件只需要注册一次,它就会保存起来,不需要多次注册,多次注册会出现错误。千万别把注册的东西放入Update多次调用,会直接使得程序崩溃。