using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class FrameAnimator : MonoBehaviour
{/// <summary>/// 序列帧/// </summary>public Sprite[] Frames{get => frames;set => frames = value;}[SerializeField] private Sprite[] frames = null;/// <summary>/// 帧率,为正时正向播放,为负时反向播放/// </summary>public float Framerate{get => framerate;set => framerate = value;}[SerializeField] private float framerate = 20.0f;/// <summary>/// 是否忽略timeScale/// </summary>public bool IgnoreTimeScale{get => ignoreTimeScale;set => ignoreTimeScale = value;}[SerializeField] private bool ignoreTimeScale = true;/// <summary>/// 是否循环/// </summary>public bool Loop{get => 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>();#if UNITY_EDITORif (image == null && spriteRenderer == null){Debug.LogWarning("No available component found. 'Image' or 'SpriteRenderer' required.", this.gameObject);}#endif}void Update(){//帧数据无效,禁用脚本if (frames == null || frames.Length == 0){this.enabled = false;}else{//从曲线值计算当前帧率float curveValue = curve.Evaluate((float) currentFrameIndex / frames.Length);float curvedFramerate = curveValue * framerate;//帧率有效if (curvedFramerate != 0){//获取当前时间float time = ignoreTimeScale ? Time.unscaledTime : Time.time;//计算帧间隔时间float interval = Mathf.Abs(1.0f / curvedFramerate);//满足更新条件,执行更新操作if (time - timer > interval){//执行更新操作DoUpdate();}}#if UNITY_EDITORelse{Debug.LogWarning("Framerate got '0' value, animation stopped.");}#endif}}//具体更新操作private void DoUpdate(){//计算新的索引int nextIndex = currentFrameIndex + (int) Mathf.Sign(currentFramerate);//索引越界,表示已经到结束帧if (nextIndex < 0 || nextIndex >= frames.Length){//广播事件FinishEvent?.Invoke();//非循环模式,禁用脚本if (loop == false){currentFrameIndex = Mathf.Clamp(currentFrameIndex, 0, frames.Length - 1);this.enabled = false;return;}}//钳制索引currentFrameIndex = nextIndex % frames.Length;//更新图片if (image is not null){image.sprite = frames[currentFrameIndex];}else if (spriteRenderer is not null){spriteRenderer.sprite = frames[currentFrameIndex];}//设置计时器为当前时间timer = ignoreTimeScale ? Time.unscaledTime : Time.time;}
}

unity序列帧动画相关推荐

  1. Unity序列帧动画疑难解答

    **Unity序列帧动画疑难解答 熟悉界面: 界面熟悉很重要,千万不要发生与别人沟通时你说菜单他去找工具栏的情况. **菜单栏:**基础创建设置工具等功能入口 **工具栏:**软件内的基本操作工具,基 ...

  2. Unity序列帧动画——Sprite图片集制作UI动画

    分享一个十分简单的在Unity中制作UI序列帧动画的方法.只需要将动画中要显示的图片导入Unity,将所有图片的TextureType设置成Sprite格式,然后全选所有图片,拖到场景中,提示要创建动 ...

  3. Unity Shader 序列帧动画

    shader中的序列帧动画属于纹理动画中的一种,主要原理是将给定的纹理进行等分,再根据时间的变化循环播放等分中的一部分. Unity Shader 内置时间变量 名称 类型 描述 _Time floa ...

  4. Unity图片序列帧动画

    unity制作序列帧两种简单方法 1.美术将整个序列帧动画图片分割为多个png图片,如 然后选中所有,鼠标拖入Hierarchy面板,unity就会自动生成序列帧动画游戏对象,点击unity播放按钮就 ...

  5. Unity shader入门精要学习笔记-代码篇6(序列帧动画/滚动背景/流动河流/广告牌/顶点动画的阴影)

    一.序列帧动画 建立一个四边形对着摄像机. 我们需要一张序列帧图像,这里用到8x8的爆炸图. 给四边形上材质和shader,代码如下: Shader "Custom/NewSurfaceSh ...

  6. unity ParticleSystem 实现序列帧动画效果(一)

    用粒子系统实现序列帧动画优势: 先附上一个 介绍序列帧实现方式比较的链接 点击打开链接 在该链接里说较为倾向于使用该方式俩实现序列帧动画,那么具体的好处又有哪些呢? 此处再贴一个链接,这里介绍了下粒子 ...

  7. Unity——用代码实现序列帧动画

    序列帧动画经常用到,最直接的方式就是用Animation录制.但某些情况下这种方式并不是太友好,需要靠代码的方式进行序列帧动画的实现. 代码实现序列帧动画,基本的思路是定义一个序列帧的数组/列表,根据 ...

  8. ❤️❤️❤️Unity废柴看过来,手把手教你做植物大战僵尸(二)—— 序列帧动画

    开始制作游戏,首先,我们要把游戏素材导入到项目中,我这里整理出来了一些项目中用到的图片音乐等素材,大家可以下载下来使用,或者自己从网上找其他好看的素材也可以. 植物大战僵尸素材 链接:https:// ...

  9. UnityShader22:序列帧动画

    一.序列帧动画 序列帧动画的原理是如此的简单,可以说只需要足够多张纸以及足够多的时间,就可以实现最简单的动画: 不使用 Animation 工具,只需要使用 Shader 中的内置时间变量,就可以实现 ...

  10. 特效转序列帧动画工具

    一 :截屏代码:ParticleExporter主要思路: 1. 设置Time.captureFramerate,可以忽略真实时间, 保证截取图片的时候每帧间隔相同 2. 在当前帧界面渲染完毕之后,因 ...

最新文章

  1. 项目经理应该具备的技能
  2. 高质量C++/C编程指南(林锐)
  3. 数据结构和算法——栈、队列、堆
  4. CoreOS 收购 Quay.io 发布私有 Docker 仓库
  5. 【Java】开源工具 Hutool 不糊涂
  6. 7号团队-团队任务5:项目总结
  7. linux指令-动态查看系统资源情况
  8. 为SIT Portal切换SIT所连接的数据库
  9. 为什么jar包代码与源代码不一致_Jacoco代码覆盖率工具
  10. 微信信息轰炸【简易版】
  11. 水电图纸——电气系统识图-3.4
  12. 宏定义的黑魔法 - 宏菜鸟起飞手册
  13. 【转载】python做图像的傅里叶变换——二维傅里叶变换
  14. 机器学习项目实践——K-means聚类实现广告分析
  15. STM32开发_利用SPI协议读写SD卡、介绍SD卡SPI时序
  16. 淘宝API 如何获取颜色 尺码 属性表
  17. win10解决,你没有权限打开该文件,请向文件的所有者或管理员申请权限
  18. 2021年JS解决那些有趣的数学题
  19. 银联unionpay取消订单与超时时间
  20. 127.0.0.1:3000端口已被占用

热门文章

  1. 芯片AD库转换之贸泽 Library Loader使用
  2. RS编码-Python工具包使用
  3. 工具系列————linux系统中安装fortran编译器(ifort)
  4. 遗传算法原理及其python实现
  5. html设置字体 圆体,css font-family字体大合集
  6. VHDL实验三:一位全加器、四选一多路选择器
  7. 卫星通信(SATCOM)设备的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. 制作温馨浪漫爱心表白动画特效HTML5+jQuery【附源码】
  9. Unity Video Player(视频)
  10. 【读书笔记-数据挖掘概念与技术】数据预处理