Unity 动画(UITweener)、协程(Coroutine)和委托(Delegate)队列管理

本文介绍了如何在Unity中管理和调度动画、协程和委托,特别是通过IPlay接口、PlayList类来实现动画的顺序播放,避免回调地狱。通过将动画和协程实现IPlay接口,然后在PlayList中维护执行顺序,实现了一个简洁的队列管理系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

        前段时间,项目中要做奖励界面UI缓动动画要一个接着一个播放,如:先播放达成星星动画,在播放经验数字增加动画,最后播放奖励物品动画。

        当然最笨最直接的方法可以类似成语接龙那样,把下个动画的开始播放都写在上一个动画播放完毕委托中。一般直接的方法是实现起来非常之简单,但这里却不是,会看见代码中有一系列播放完毕回调函数(除了最后一个),显然维护起来是否费劲。

        把上面的方法进行简化,把回调函数变为一个:维护一个动画的 List 和当前播放动画的索引 index ,然后再回调函数中只需要让 index 递增 播放动画就可以了。这个方法比上面成语接龙方法改进的地方在于只需要维护List中动画的顺序,不用还要做首尾结合的工作了。

 

        上面的问题之所以会觉得有点棘手是因为动画是在一个时间片段上“连续”执行的,这里的“时间片段”不是计算机概念上的 time slot 。在使用协程和延时委托也会遇到同样的问题,本来就是介绍使用队列对动画,协程和委托的管理,只需要关心彼此在队列的次序。

         

 IPlay定义  

         先定义了一个借口 IPlay 有两个方法:

                Begin() ,动画,协程 开始执行方法

                OnEnd ,动画,协程 执行完毕的回调函数(委托队列)

这里的 EventDelegate 类型是 NGUI 定义的, 可以查看参考①。 IPay 只是定义了 开始 和 结束 两个状态,其实是在 上一个 OnEnd 中执行了下一个 的 Begin 方法。

C#代码   收藏代码
  1. using System;  
  2. using System.Collections.Generic;  
  3. public interface IPlay  
  4. {  
  5.     List<EventDelegate> OnEnd  
  6.     {  
  7.         get;  
  8.     }  
  9.     void Begin();  
  10. }  

实现IPlay

       在项目中,主要是使 UITweener 实现了 IPlay ,UITweener 本来就支持IPlay的这两个方法,只是封装下就可以了:

C#代码   收藏代码
  1. public abstract class UITweener : MonoBehaviour,IPlay  
  2. {  
  3.         [HideInInspector]  
  4.     public List<EventDelegate> onFinished = new List<EventDelegate>();  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值