using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; using DG.Tweening; /******************************************************************************** *Create By CG *Function 图片序列帧动画 *********************************************************************************/ namespace CG.UTility { public class SpriteImgAnm : MonoBehaviour { [Header("自动播放")] public bool PlayAwake; [Header("循环播放")] public bool Loop = false; [Tooltip("序列帧的图片")] [SerializeField] private Sprite[] m_frames; [Header("播放总用时")] public float TotalTime = 2.0f; [Header("插入事件位置")] public int ActionFrame = -1; [SerializeField] private UnityEvent m_frameEvent; private SpriteRenderer _container; private Image _containerImg; private int _ticked; private bool _doAnim; public bool DoAnim { get { return _doAnim; } set { _doAnim = value; } } private void Start() { _container = GetComponent(); if (_container == null) { _containerImg = GetComponent(); } Init(); } private void Init() { _ticked = 0; if (PlayAwake) { Play(); } _doAnim = PlayAwake; } private void SetContainerSprite(Sprite sprite) { if (_container != null) _container.sprite = sprite; else _containerImg.sprite = sprite; } public void Play() { _ticked = 0; _doAnim = true; float startTimeTemp = 0.0f; if (Loop) { Sequence sequence = DOTween.Sequence(); sequence.Append(DOTween.To(() => _ticked, x => _ticked = x, m_frames.Length, TotalTime).OnUpdate(() => { SetContainerSprite(m_frames[_ticked]); if (_ticked == ActionFrame) m_frameEvent.Invoke(); })). Insert(0.5f, DOTween.To(() => startTimeTemp, x => startTimeTemp = x, 1.0f, 0.5f).OnComplete(() => { transform.GetChild(0).gameObject.SetActive(true); })). Insert(TotalTime - 0.5f, DOTween.To(() => startTimeTemp, x => startTimeTemp = x, 1.0f, 0.5f).OnPlay(() => { transform.GetChild(0).gameObject.SetActive(false); })).SetLoops(-1, LoopType.Restart).SetId("anmLoop"); } else { Sequence sequence = DOTween.Sequence(); sequence.Append(DOTween.To(() => _ticked, x => _ticked = x, m_frames.Length, TotalTime).OnUpdate(() => { SetContainerSprite(m_frames[_ticked]); if (_ticked == ActionFrame) m_frameEvent.Invoke(); })). Insert(0.5f, DOTween.To(() => startTimeTemp, x => startTimeTemp = x, 1.0f, 0.5f).OnComplete(() => { transform.GetChild(0).gameObject.SetActive(true); })). Insert(TotalTime-0.5f, DOTween.To(() => startTimeTemp, x => startTimeTemp = x, 1.0f, 0.5f).OnPlay(() => { transform.GetChild(0).gameObject.SetActive(false); })).SetId("anmLoop"); } } public void Pause() { _doAnim = false; DOTween.Pause("anmLoop"); } public void Resume() { _doAnim = true; DOTween.Play("anmLoop"); } public void Stop() { _ticked = 0; DOTween.Kill("anmLoop"); _doAnim = false; } } }