/*
* author:maki
* time: 2019年10月9日14:05:59
* describe: 在rawimage下播放动画代码
* */
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
[RequireComponent(typeof(RawImage))]
public class UITextureAnim : MonoBehaviour
{
//播放帧数
public float FPS = 20;
//播放目标图片
public List<Texture2D> TextureFrames;
private RawImage mRawImage;
private int mCurFrame = 0;
private float mDelta = 0;
[SerializeField] bool IsPlaying = false;
[SerializeField] bool Forward = true;
[SerializeField] bool AutoPlay = false;
public bool Loop = false;
public int FrameCount
{
get { return TextureFrames.Count; }
}
private void Awake()
{
mRawImage = GetComponent<RawImage>();
}
private void Start()
{
if (AutoPlay)
{
Play();
}
else
{
IsPlaying = false;
}
}
/// <summary>
/// 播放
/// </summary>
public void Play()
{
IsPlaying = true;
Forward = true;
}
/// <summary>
/// 倒放
/// </summary>
public void PlayReverse()
{
IsPlaying = true;
Forward = false;
}
/// <summary>
/// 暂停
/// </summary>
public void Pause()
{
IsPlaying = false;
}
/// <summary>
/// 继续播放
/// </summary>
public void Resume()
{
if (!IsPlaying)
{
IsPlaying = true;
}
}
/// <summary>
/// 结束播放
/// </summary>
public void Stop()
{
mCurFrame = 0;
SetTexture(mCurFrame);
IsPlaying = false;
}
/// <summary>
/// 重新播放
/// </summary>
public void Rewind()
{
mCurFrame = 0;
SetTexture(mCurFrame);
Play();
}
private void SetTexture(int idx)
{
mRawImage.texture = TextureFrames[idx];
mRawImage.SetNativeSize();
}
private void Update()
{
if (!IsPlaying || 0 == FrameCount)
{
return;
}
mDelta += Time.deltaTime;
if (mDelta > 1 / FPS)
{
mDelta = 0;
if (Forward)
{
mCurFrame++;
}
else
{
mCurFrame--;
}
if (mCurFrame >= FrameCount)
{
if (Loop)
{
mCurFrame = 0;
}
else
{
IsPlaying = false;
return;
}
}
else if (mCurFrame < 0)
{
if (Loop)
{
mCurFrame = FrameCount - 1;
}
else
{
IsPlaying = false;
return;
}
}
SetTexture(mCurFrame);
}
}
}