Simple example of unity - automatic playback of sequence frame pictures

In order to optimize the sequence frame animation call of unity, instead of using the animation call animation that comes with unity, I wrote a sequence frame animation script similar to animation animation that can insert events, which can be image or spriterender

using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
/****************************************************
作者:cg
功能:图片序列帧动画
*****************************************************/
public class SpriteImgAnm : MonoBehaviour
{
    [Header("自动播放")]
    public bool PlayAwake;
    [Header("循环播放")]
    public bool Loop = false;
    [Tooltip("序列帧的图片")]
    [SerializeField]
    private Sprite[] m_frames;
    [Header("播放速度")]
    public float Speed = 0.05f;
    [Header("插入事件位置")]
    public int ActionFrame = -1;
    [SerializeField]
    private UnityEvent m_frameEvent;

    private SpriteRenderer _container;
    private Image _containerImg;
    private int _ticked;
    private float _time;
    private bool _doAnim;

    public bool DoAnim { get { return _doAnim; } set { _doAnim = value; } }

    private void Awake()
    {
        _container = GetComponent<SpriteRenderer>();
        if (_container == null)
        {
            _containerImg = GetComponent<Image>();
        }
        Init();
    }

    private void Init()
    {
        _ticked = 0;
        _time = 0;
        _doAnim = PlayAwake;
        SetContainerSprite(m_frames[0]);
    }
    private void SetContainerSprite(Sprite sprite)
    {
        if (_container != null)
            _container.sprite = sprite;
        else
            _containerImg.sprite = sprite;
    }

    public void Play()
    {
        _ticked = 0;
        _time = 0;
        _doAnim = true;
        SetContainerSprite(m_frames[0]);
    }

    public void Pause()
    {
        _doAnim = false;
    }

    public void Resume()
    {
        _doAnim = true;
    }

    public void Stop()
    {
        _ticked = 0;
        _time = 0;
        _doAnim = false;
        SetContainerSprite(m_frames[0]);
    }

    void Update()
    {
        if (_doAnim)
        {
            _time += Time.deltaTime;
            if (_time > Speed)
            {
                _ticked++;
                if (_ticked == m_frames.Length)
                {
                    if (Loop)
                    {
                        _ticked = 0;
                    }
                    else
                    {
                        _ticked = m_frames.Length - 1;
                    }
                }
                _time = 0;

                if (_ticked == ActionFrame)
                    m_frameEvent.Invoke();

                SetContainerSprite(m_frames[_ticked]);
            }
        }
    }
}

 

Guess you like

Origin blog.csdn.net/cgExplorer/article/details/108534792