今天使用NGUI的TweenScale时遇到一个问题
使用时TweenScale是用两次,playForward()和playReverse(),要求playForward()后啥都不做,playReverse()后执行函数
由于动画播放需要时间,不可能执行完playReverse()代码就执行指定函数
NGUI提供了对应的委托处理,所以思路上是在playForward()时将onFinished置为null,playReverse()时添加指定方法
对应代码
EventDelegate.Callback panelClose= PanelClose;panelScale.SetOnFinished(panelClose);置为null时代码panelScale.onFinished = null;选中添加TweenScale的GameObject,以便实时查看
运行,没问题,一切正常
导出apk测试发现相应函数没执行
回到unity,测试是没问题的,不经意间选择其他GameObject,在进行测试,问题出现了
检查相应代码,将置null代码改成如下代码
EventDelegate.Callback finish = null;panelScale.SetOnFinished(finish);经过测试,一切正常
NGUI中的事件回调将用户添加的数据加入到链表,链表中每项包含一个MonoBehaviour target 和 string methodName
public List<EventDelegate> onFinished = new List<EventDelegate>();public void SetOnFinished (EventDelegate.Callback del) { EventDelegate.Set(onFinished, del); }static public void Set (List<EventDelegate> list, Callback callback){if (list != null){list.Clear();list.Add(new EventDelegate(callback));}}
从NGUI代码中可以发现,一开始设置的onFinished和后面设置的setOnfinished两个是完全不同的操作
一个是将链表onFinished = null,,一个是将链表onFinished.clear(),并添加null到链表
看到这里,在将上面的两句代码改成下面这句
panelScale.onFinished.Clear();
经过测试,一切正常
这里只需要清空和添加一个委托,如果需要多个的,可以参考AddOnfinished()和RemoveOnFinished()这两个函数
文章原创,转载请注明
快乐要懂得分享,才能加倍的快乐