2025-01-02 12:15:45 +08:00

126 lines
4.0 KiB
C#

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<SpriteRenderer>();
if (_container == null)
{
_containerImg = GetComponent<Image>();
}
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;
}
}
}