using Thousandto.Code.Center;
using Thousandto.Plugins.Common;
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
namespace Thousandto.GameUI.Form
{
///
/// 直接为UISprite的对象上挂接这个脚本
/// 挂上后,sprite会有帧动画显示(如果name可以连续读取)
/// sprite在atlas中的名字必须是如下格式: name_index (sprite_0 sprite_1 sprite_2 ...)
///
public class UISpriteAnim : MonoCacheBase
{
#region 私有成员变量
//当前sprite组件
private UISprite _currentSprite;
//sprite在atlas中的名字
private string _spName;
//如果当前是sprite组件,则支持动画
private bool _supportAnim;
//是否循环播放
private bool _loop;
//如果不是loop,则会显示指定的随机帧
private int _randomFrame;
//指定循环播放几次
private int _loopTimes;
//是否指定循环播放
private bool _limitLoop;
//是否开始播放
private bool _play;
//设置sprite最大支持的动画帧数
private int _animImgMaxCount = 100;
//播放的sprite序列号
private int _animImgIndex = 0;
//sprite轮换速度,即播放动画的速率,这里是0.1秒播放1帧
private float _speed = 0.1f;
//update函数在播放一帧动画前累计的时间,如果比较卡,update刷新一次就可能超过0.1秒
//所有就需要用累积时间计算当前应该播放的动画帧,可能会跳过几帧动画
private float _timeDelta = 0;
//sprite在altas中所有一系列的名字,用于播放动画
private List _spAnimNameList = new List();
#endregion
#region//继承MonoBehaviour
private void Awake()
{
Initialize();
}
private void Start()
{
}
//初始化
private void OnEnable()
{
_timeDelta = 0;
}
private void Update()
{
if (_supportAnim && _play && _spAnimNameList.Count > 0)
{
_timeDelta += Time.deltaTime;
//计算需要播放的是后续的第几帧动画,当count>0才播放
int count = (int)(_timeDelta / _speed);
if (count == 0)
{
return;
}
playNextAnim(count);
}
}
#endregion
public void Initialize()
{
_spAnimNameList.Clear();
_currentSprite = transform.GetComponent();
if (_currentSprite != null)
{
_spName = _currentSprite.spriteName;
//有"_"作分割,说明是有系列sprite,能播放动画
if (!_spName.Contains("_"))
{
return;
}
_supportAnim = true;
string spriteHeadName = _spName.Split('_')[0];
string spriteAnimName = null;
for (int i = 1; i < _animImgMaxCount; ++i)
{
spriteAnimName = string.Format("{0}_{1}", spriteHeadName, i);
if (_currentSprite.atlas.GetSprite(spriteAnimName) == null)
{
break;
}
_spAnimNameList.Add(spriteAnimName);
}
}
_loop = true;
}
public void Play()
{
_play = true;
}
///
/// 设置最后展示的动画帧
///
public void SetShowFrame(int index)
{
_randomFrame = index;
}
///
/// 设置循环次数, 0 为不循环, 默认3次
///
public void SetLoopTimes(int times = 3)
{
_loopTimes = times;
_limitLoop = true;
}
public void Pause()
{
_play = false;
}
public void Stop()
{
_play = false;
_animImgIndex = 0;
_timeDelta = 0;
}
///
/// 播放后续第几帧动画
///
/// 第几帧
private void playNextAnim(int count)
{
_animImgIndex += count;
//循环次数
if (_limitLoop && _animImgIndex == _spAnimNameList.Count - 1)
{
_loopTimes -= 1;
if (_loopTimes < 0)
{
_animImgIndex = _randomFrame;
Pause();
}
}
if (_animImgIndex >= _spAnimNameList.Count)
{
_animImgIndex = 0;
}
_currentSprite.spriteName = _spAnimNameList[_animImgIndex];
_currentSprite.color = Color.white;
//当播放了下一帧动画后,累积时间清0
_timeDelta = 0;
}
}
}