最近的项目用SpriteRenderer+Animation的方式播放序列帧,unity编辑器里是可以正常播放没问题的,但打包出去后,发现一闪一闪的,什么玩意啊。。。然后搜索了一下文章,看到个大佬写的,换成image播放序列帧就可以了。
原文链接:https://blog.csdn.net/SerenaHaven/article/details/79273114
好了问题解决是解决了。然后我发现挂上脚本后,因为脚本上有个精灵体数组,要自己一个一个添加,比较麻烦。于是我改了下动态加载,代码如下:
using UnityEngine;
using UnityEngine.UI;
using System;
/// <summary>
/// 序列帧动画播放器
/// 支持UGUI的Image和Unity2D的SpriteRenderer
/// </summary>
public class FrameAnimator : MonoBehaviour
{
/// <summary>
/// 序列帧数
/// </summary>
public int _framesCount;
/// <summary>
/// 序列帧名字前半部分 例如: image_1.jpg中的 image_为前半部分
/// </summary>
public string _framesName;
/// <summary>
/// resource文件夹下的文件夹路径 例如:Resources/Test/Sprites 则直接赋值 Test/Sprites 序列帧放在Sprites文件夹下就好
/// </summary>
public string _folderPath;
/// <summary>
/// 序列帧
/// </summary>
private Sprite[] frames = null;
/// <summary>
/// 帧率,为正时正向播放,为负时反向播放
/// </summary>
public float Framerate { get { return framerate; } set { framerate = value; } }
[SerializeField] private float framerate = 20.0f;
/// <summary>
/// 是否忽略timeScale
/// </summary>
public bool IgnoreTimeScale { get { return ignoreTimeScale; } set { ignoreTimeScale = value; } }
[SerializeField] private bool ignoreTimeScale = true;
/// <summary>
/// 是否循环
/// </summary>
public bool Loop { get { return loop; } set { loop = value; } }
[SerializeField] private bool loop = true;
//动画曲线
[SerializeField] private AnimationCurve curve = new AnimationCurve(new Keyframe(0, 1, 0, 0), new Keyframe(1, 1, 0, 0));
/// <summary>
/// 结束事件
/// 在每次播放完一个周期时触发
/// 在循环模式下触发此事件时,当前帧不一定为结束帧
/// </summary>
public event Action FinishEvent;
//目标Image组件
private Image image;
//目标SpriteRenderer组件
private SpriteRenderer spriteRenderer;
//当前帧索引
private int currentFrameIndex = 0;
//下一次更新时间
private float timer = 0.0f;
//当前帧率,通过曲线计算而来
private float currentFramerate = 20.0f;
/// <summary>
/// 重设动画
/// </summary>
public void Reset()
{
currentFrameIndex = framerate < 0 ? frames.Length - 1 : 0;
}
/// <summary>
/// 从停止的位置播放动画
/// </summary>
public void Play()
{
this.enabled = true;
}
/// <summary>
/// 暂停动画
/// </summary>
public void Pause()
{
this.enabled = false;
}
/// <summary>
/// 停止动画,将位置设为初始位置
/// </summary>
public void Stop()
{
Pause();
Reset();
}
//自动开启动画
void Start()
{
image = this.GetComponent<Image>();
spriteRenderer = this.GetComponent<SpriteRenderer>();
//初始化精灵体数组
frames = new Sprite[_framesCount];
for (int i = 0; i < _framesCount; i++)
frames[i] = Resources.Load<Sprite>(_folderPath + "/" + _framesName + i) as Sprite;
#if UNITY_EDITOR
if (image == null && spriteRenderer == null)
{
Debug.LogWarning("No available component found.