126 lines
4.0 KiB
C#
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;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|