一、要播放的动画(直播中间一截)
如图:总的动画为长度为2分钟零8秒
二、Button和对应事件
三、事件的代码
在Start()里面绑定
private void Awake()
{
myAnim = animGo.GetComponent<Animation>();
//【循环播放自定义段落】事件侦听
BtnPlayLoop.onClick.AddListener(async () =>
{
var skipFirstFrameTime = 1 / myAnim[myAnim.clip.name].clip.frameRate; //跳过一帧的时间是多少【第一帧是初始姿势,需要排除】
stopLoop = false;
while (!stopLoop)
{
myAnim[myAnim.clip.name].time = skipFirstFrameTime; //跳过第一帧
myAnim.Play(myAnim.clip.name); //Play()
await UniTask.DelayFrame(1); //帧延缓,等Play()启动
//方式一:播放到中间指定的进度点则停止
//await UniTask.WaitUntil(()=>myAnim[myAnim.clip.name].time > endTime); //播放进度到达某点的时候
//myAnim.Stop(); //停止播放
//方式二:播放到末尾(动画属性设置成once)
await UniTask.WaitUntil(() => myAnim.isPlaying == false); //等待播放结束【myAnim.isPlaying == false】
}
});
//【停止循环播放】事件侦听
BtnStopLoop.onClick.AddListener(async() =>
{
stopLoop = true;
myAnim[myAnim.clip.name].time = myAnim[myAnim.clip.name].length; //这一句用于跳到结束位,酌情添加
await UniTask.DelayFrame(1); //配合上一句服用:延缓一帧,用于渲染
myAnim.Stop();
});
}
四、总结
本文所涉及动画播放控制的异步用UniTask包(GitHub地址自行谷歌)实现。用异步实现,逻辑清晰,好控制,不容易被自己绕晕。
【1】凡是涉及渲染处理的那部分,都丢到Update里面
【2】凡是涉及时序控制的,都用丢到一个异步方法里面