Unity——用代码实现序列帧动画(动态加载)

最近的项目用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. 
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值