功能如题,原理这里不做多余解释,直接上代码。
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(Image))]
public class UI2dAnimation : MonoBehaviour
{
#region 字段
#region Private
private Image m_ImageSource = null;
/// <summary>当前帧</summary>
private int m_CurFrame = 0;
/// <summary>计时</summary>
private float m_Delta = 0;
#endregion
#region Public
public Sprite[] SpriteFrames;
/// <summary>帧率</summary>
public float FPS = 5;
/// <summary>是否正在运行</summary>
public bool IsPlaying = false;
/// <summary>正向</summary>
public bool Foward = true;
/// <summary>自动运行</summary>
public bool AutoPlay = false;
/// <summary>循环</summary>
public bool Loop = true;
#endregion
#endregion
/// <summary>帧数量</summary>
public int FrameCount { get { return SpriteFrames.Length; } }
#region Unity系统函数
void Awake()
{
m_ImageSource = GetComponent<Image>();
}
void Start()
{
if (AutoPlay)
Play();//自动运行
else
IsPlaying = false;
}
void Update()
{
if (!IsPlaying || 0 == FrameCount) return;//不运行
m_Delta += Time.deltaTime;//计时
if (m_Delta > 1 / FPS)
{
m_Delta = 0;
if (Foward) m_CurFrame++;//正向播放
else m_CurFrame--;//反向播放
if (Loop)
{//循环
if (m_CurFrame >= FrameCount)
{//正向播放
m_CurFrame = 0;
}
else if (m_CurFrame < 0)
{//反向播放
m_CurFrame = FrameCount - 1;
}
}
else
{//播放一遍就停
IsPlaying = false;
return;
}
SetSprite(m_CurFrame);
}
}
#endregion
/// <summary>设置精灵summary>
/// <param name="idx">精灵所以</param>
private void SetSprite(int idx)
{
m_ImageSource.sprite = SpriteFrames[idx];
//m_ImageSource.SetNativeSize();
}
#region Public
/// <summary>运行</summary>
public void Play()
{
IsPlaying = true;
Foward = true;
}
/// <summary>运行倒放</summary>
public void PlayReverse()
{
IsPlaying = true;
Foward = false;
}
/// <summary>暂停</summary>
public void Pause()
{
IsPlaying = false;
}
/// <summary>重新开始</summary>
public void Resume()
{
if (!IsPlaying)
{
IsPlaying = true;
}
}
/// <summary>停止</summary>
public void Stop()
{
m_CurFrame = 0;
SetSprite(m_CurFrame);
IsPlaying = false;
}
/// <summary>倒带</summary>
public void Rewind()
{
m_CurFrame = 0;
SetSprite(m_CurFrame);
Play();
}
#endregion
}