Unity代码实现序列帧动画播放器代码实现序列帧动画播放器
主要为大家详细介绍了Unity代码实现序列帧动画播放器,具有一定的参考价值,感兴趣的小伙伴们可以参考一
下
序列帧动画经常用到,最直接的方式就是用Animation录制。但某些情况下这种方式并不是太友好,需要靠代码的方式进行序
列帧动画的实现。
代码实现序列帧动画,基本的思路是定义一个序列帧的数组/列表,根据时间的流逝来确定使用哪一帧并更新显示。
NGUI的UI2DSpriteAnimation已经实现了此功能,但是它支持的目标只有Native2D的SpriteRenderer组件或者NGUI自身的
UI2DSprite组件,并不支持UGUI的Image组件。
当然可以通过改写源码的方式来添加对Image组件的支持,不过秉着学习的目的,我这里重新写了一个同时支持Image组件和
SpriteRenderer组件的序列帧动画播放器。
代码如下,注释写的很详细了,不再赘述。
using UnityEngine;
using UnityEngine.UI;
using System;
/// <summary>
/// 序列帧动画播放器
/// 支持UGUI的Image和Unity2D的SpriteRenderer
/// </summary>
public class FrameAnimator : MonoBehaviour
{
/// <summary>
/// 序列帧
/// </summary>
public Sprite[] Frames{ get { return frames; } set { frames = value; } }
[SerializeField]private Sprite[] frames = null;
/// <summary>
/// 帧率,为正时正向播放,为负时反向播放
/// </summary>
public float Framerate { get { return framerate; } set { framerate = value; } }
[SerializeField] private float framerate = 20.0f;
/// <summary>
/// 是否忽略timeScale
/// </summary>
public bool IgnoreTimeScale{ get { return ignoreTimeScale; } set { ignoreTimeScale = value; } }
[SerializeField]private bool ignoreTimeScale = true;
/// <summary>
/// 是否循环
/// </summary>
public bool Loop{ get { return loop; } set { loop = value; } }
[SerializeField]private bool loop = true;
//动画曲线
[SerializeField]private AnimationCurve curve = new AnimationCurve (new Keyframe (0, 1, 0, 0), new Keyframe (1, 1, 0, 0));
/// <summary>
/// 结束事件
/// 在每次播放完一个周期时触发
/// 在循环模式下触发此事件时,当前帧不一定为结束帧
/// </summary>
public event Action FinishEvent;
//目标Image组件
private Image image;
//目标SpriteRenderer组件
private SpriteRenderer spriteRenderer;
//当前帧索引
private int currentFrameIndex = 0;
//下一次更新时间
private float timer = 0.0f;
//当前帧率,通过曲线计算而来
private float currentFramerate = 20.0f;
评论5