Unity播放序列帧

Unity | 动画组件篇-动画组件的认识和如何简单使用序列帧 动画系统包含两个东西: 1.动画 2.控制动画啥时候播放的东西 阅读详情
AI摘要

分享一个在Unity3D中用于播放序列帧动画的简单实用插件,支持单组或多组序列帧循环播放,提供了动画控制和事件回调功能。

在U3D中播放序列帧应该算是一个非常常见的需求了,基本做过一些正式项目的朋友或多或少都会遇到,包括我自己,所以自己就写了一个非常简单但又好用的播放序列帧的小插件,今天就拿出来给大家分享分享,话不多说直接上图撸代码!

效果展示:

单组序列帧循环播放

多组序列帧顺序播放

OK说一下使用方法,方法很简单几张图一目了然

1.准备序列帧资源

2.在场景中给要播放的Image挂上FramesAnimation.cs脚本

3.在某个地方存储你要使用Sprite图片组(我这里为了演示图省事直接挂在场景中的的Test脚本上了,你们可以根据需要自动加载配置等)

4.然后调用播放方法(list1为你传入的图片数组,true表示循环)

OK下面放上源码

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;

public class FramesAnimation : MonoBehaviour
{
    protected enum anim_status
    {
        unstart,
        running,
        pause,
        stop
    }

    protected Image image
    {
        get
        {
            return GetComponent<Image>();
        }
    }
    //当前的序列帧动画
    public List<Sprite> image_list = new List<Sprite>();

    //一串连续播放的序列帧动画组
    public List<List<Sprite>> Sequence = new List<List<Sprite>>();
    //当前播放的序列帧ID(如果ID=-1,则不播放序列帧动画。其他时按照ID来播放动画,播完一个动画自动切到下一个动画,全部播完时停留在最后一个动画)
    protected int SequenceID = -1;

    protected bool loop = true;
    protected anim_status status;

    protected UnityAction onComplete;
    //添加动画完成事件,动画第一次循环结束时执行
    public void OnComplete(UnityAction _event)
    {
        onComplete = _event;
    }
    //动画停止时执行一次。
    protected UnityAction EndEvent;
    public void SetEndEvent(UnityAction _event)
    {
        EndEvent = _event;
    }
    //动画每次循环都执行
    protected UnityAction CircleEvent;
    public void SetCircleEvent(UnityAction _event)
    {
        CircleEvent = _event;
    }

    protected UnityAction Change_event;
    //当前帧索引
    private int currentFrameIndex = 0;
    //动画帧率
    private float Framerate = 20.0f;


    void Update()
    {
        if (status == anim_status.running)
        {
            //按帧率播放
            if (Time.frameCount % (30 / Framerate) == 0)
            {
                currentFrameIndex++;
            }

            //第一次播放结束
            if (currentFrameIndex >= image_list.Count)
            {
                SequenceRule();
                currentFrameIndex = 0;
                CircleEvent?.Invoke();
                onComplete?.Invoke();
                if (onComplete != null)
                {
                    onComplete = null;
                }
                Change_event?.Invoke();
                if (!loop && SequenceID == -1)
                {
                    status = anim_status.stop;
                    //停在最后一帧
                    currentFrameIndex = image_list.Count - 1;
                }
            }
            if (image_list.Count != 0)
            {
                image.sprite = image_list[currentFrameIndex];
            }
            else
            {
                Debug.LogError("动画序列帧为空!");
            }
        }
    }

    public void ClearSequence()
    {
        status = anim_status.stop;
        image_list.Clear();
        Sequence.Clear();
    }

    void SequenceRule()
    {
        if (SequenceID != -1)
        {
            if (SequenceID < Sequence.Count - 1)
            {
                image_list.Clear();
                SequenceID++;
                Sequence[SequenceID].ForEach(i => image_list.Add(i));
            }
            else
            {
                SequenceID = -1;
            }
        }
    }


    /// <summary>
    /// 多组序列帧播放
    /// </summary>
    /// <param name="_sequence">传入的多组图片</param>
    public void AnimPlaySequence(List<List<Sprite>> _sequence)
    {
        ClearSequence();
        SequenceID = 0;
        currentFrameIndex = 0;
        foreach (List<Sprite> _list in _sequence)
        {
            Sequence.Add(_list);
        }
        Sequence[0].ForEach(i => image_list.Add(i));
        image.sprite = image_list[0];
        loop = true;
        status = anim_status.running;
    }

    public void AnimPlay(List<Sprite> _list, bool _loop = false, int frame = 0)
    {
        ClearSequence();
        SequenceID = 0;
        currentFrameIndex = 0;
        _list.ForEach(i => image_list.Add(i));
        image.sprite = image_list[0];
        loop = _loop;
        currentFrameIndex = frame;
        status = anim_status.running;
    }

    public void AnimPause()
    {
        status = anim_status.pause;
    }

    public void AnimContinue()
    {
        status = anim_status.running;
    }

    public void AnimReplay()
    {
        currentFrameIndex = 0;
    }

    public void AnimStop()
    {
        status = anim_status.stop;
        currentFrameIndex = 0;
        EndEvent?.Invoke();
    }

    public void ChangeClip(List<Sprite> new_list, bool Immediately = false)
    {
        Change_event = delegate
        {
            image_list.Clear();
            new_list.ForEach(i => image_list.Add(i));
        };
        if (Immediately)
        {
            Change_event?.Invoke();
        }
        else
        {
            Change_event += delegate
            {
                Change_event = null;
            };
        }
    }
}

代码中基本功能都差不多已经有了,包括:

1.帧率的设定

2.是否受TimeScale影响

3.不同播放节点的回调

序列帧播放的原理没啥好说的,Update里按照一定的帧率或时间逐帧切换图片。
但下面额外讲讲AnimPlaySequence()这个方法

如果你只是用一组序列帧播放的话AnimPlay()就很方便使用了,

但我们播放的需求往往没有这么简单,往往是多组序列帧来回切换或拼接播放的,那么你就可以使用队列播放这个方法

_sequence这个参数就是传入的多组图片

调用这个方法动画就会按照你传入的数组顺序播放,然后在最后一组动画内循环播放(各位可按需修改为需要的效果)

OK内容差不多就是这些了,上面GIF的效果我做成了Demo上传到了Github上,有需要的朋友可以前去自行下载。传送门

 

原创不易!转发的朋友记得加上转载声明哦,喜欢的朋友可以顺手点个赞哈,谢谢啦!

 

Unity实现帧序列 1.想实现序列帧效果自己使用Animation一直无法实现动画播放效果。 阅读详情

相关推荐

Unity出模型动画的序列帧(特效序列帧)

假如所有的特效用这套方法都不是带透明通道的,还能理解,但是有一些 特效输出来的带有的透明通道的,而有些却没有带透明通道。在Game窗口中查看是否是需要的渲染角度,如若不是,则更换摄像机的角度或者位置,使之渲染你想要的角度。(4)按F10,打开Recorder,添加Recorder为Image,绿色箭头为输出的路径。将需要打序列帧的物体,带有动画的,拖入刚刚新增的Activation中,调整摄像机位置。将需要输出序列帧的模型或者物体的渲染层级设置为刚刚渲染摄像机渲染的层级Layer。

Gxy_w的博客 8857

Unity 代码控制播放序列帧动画的实现

Unity 代码控制播放序列帧动画的实现

不在同一频道上的呆子的博客 2681

unity序列帧特效动态创建播放

using UnityEngine; using System.Collections; using System.Collections.Generic; public class SpriteAniTool{ public static Dictionary EffectLib = new Dictionary(); /// /// 在场景中添加一个特效,按位置添加,参数代表:名字,持

在动画制作和游戏制作中间摇摆 3115

【Unity】在Unity中播放序列帧动画、播放图集动画

本文通过两种方式播放序列动画,第一种(逐图播放)简单易操作但性能略差,第二种(图集播放)性能相对更好一些但操作相对复杂。不过还是建议使用第二种,因为第二种更适合做合理的架构,不仅仅是序列动画,平时用的 UI 资源也可以一起放到图集资源中,通过不同的名称进行获取。注意【Unity】在Unity 3D中使用Spine开发2D动画。

一个普普通通的游戏开发者 8421

Unity GIF动画播放全解析:从原理到高性能序列帧实现方案

在游戏开发中,动画是实现丰富视觉表现的核心技术之一。其基本原理是通过连续播放一系列静态图像(序列帧)来模拟运动效果,这与视频编码中的帧间压缩思想有共通之处。从技术价值看,高效的动画播放方案能显著降低CPU与GPU负载,优化内存使用,是保障游戏流畅运行的关键。在Unity引擎中,处理GIF这类传统动画格式常面临原生支持不足的挑战,因为其多帧存储方式与引擎的实时渲染管线并不匹配。为此,开发者通常采用预转换为序列帧并结合精灵图集(Sprite Atlas)的方案,这不仅能完美融入Unity的Sprite渲染系统,

weixin_30561177的博客 300

Unity合批处理优化内存序列帧播放动画

这里是针对Unity序列帧动画的优化内容,将多个图片合批处理然后为了降低Unity的内存占用,但是相对的质量也会稍微降低。可自行进行批处理。如果一个图一张的话肯定是会占用太多的内存,所以直接将图片进行合批处理将多个图放到一张上去就会比较节省内存。不知道怎么处理图片的可以去看一下PS图片批处理上面文章中我没有将处理完的图合并到一张上这个比较简单我就不操作了。不知道视频怎么转序列帧的可以看这个视频转序列帧。

类人_猿的博客 810

unity 代码播放序列帧动画

using UnityEngine; using UnityEngine.UI; using System; /// <summary> /// 序列帧动画播放器 /// 支持UGUI的Image和Unity2D的SpriteRenderer /// </summary> public class FrameAnimator : MonoBehaviour { /// <summary> /// 序列帧 /// </summary&...

qq_41614248的博客 1552

Unity 2020.3.15版本中序列帧播放的实现与应用

序列帧动画是动画表现形式的一种,它由一系列连续帧组合而成,每一帧都稍微变化,通过快速连续播放这些帧,形成动态的视觉效果。这种方法广泛应用于游戏和动画制作中,其核心在于利用人类视觉的滞后性,使得静态帧连续播放时呈现出运动的错觉。序列帧动画在技术实现上,通常需要将独立帧图像以数组或列表的形式进行管理。这些帧图像按照特定顺序排列,通过定时器或动画循环来控制帧的播放速率。由于动画是通过逐帧渲染实现的,这要求设计者需要在保持动画流畅性的同时,有效管理帧率和内存的使用,以保证动画运行的性能。

weixin_30415591的博客 1096

unity 播放 序列帧图片 动画

适用于一下简单的动态效果,不建议大量使用序列帧。好记性不如烂笔头!

qq_37524903的博客 5900

【牛股启动线】副图指标使用技术说明,图文案例分享,通达信炒股指标

如上图,在紫色线在黑色虚线上时,在出现紫色柱线时,通常会出现强势拉升的行情​。柱线加长加上紫色线上扬,进场跟随做多抓强势行情,紫色柱线和紫色线同时做多持续则可以继续持股。如上图,副图指标【牛股启动线】,指标信号包括紫色线走势信号和紫色柱线信号,以及底部的四条虚线技术信号​,还有一条绿色的参考线,一条黑色的虚线两天分档线。如上图,参考买点,紫色柱线开始出现时进场买点,在上图标记的位置对应的就是进场买点​。紫色柱线加长+紫色线上扬,多头共振持股,行情继续拉升阶段,持股待涨或顺势​进场做多。

weixin_69760830的博客 1907

Crawl4AI实战:5分钟搞定电商价格监控爬虫(附Python代码)

本文详细介绍了如何利用开源AI网络爬虫框架Crawl4AI快速构建电商价格监控系统。通过Python实战代码,展示了从环境配置、智能内容提取到多平台适配、定时任务与数据可视化的完整流程,帮助运营人员和技术开发者高效实现自动化价格追踪与竞品分析。

weixin_29090917的博客 414

Unity播放序列帧,功能丰富

Unity播放序列帧,功能丰富 话不多说,直接上代码 /*********************************** * Description:描述这是一个图片序列帧播放脚本,适用于少量的一组序列帧,且分辨率较小,若出现花屏,打包不成功等情况,请先排除序列帧分辨率过大、序列帧组数过多 * Mountpoint:将其挂载在Image组件上 * Date:2021.11 * Version: * Author:九八 ***************************

weixin_45265453的博客 3869

基于E310的纯逻辑代码实现AD9361射频收发

基于微相科技的E310平台实现AD9361的射频收发功能。采用纯逻辑控制的方式,不需要PS参与。实现了用VIO控制收发使能,发射功率,收发频率,数据接口时序控制,接收增益,BIST测试等功能。

xiaomingzi55的博客 2331

unity简单示例——序列帧图片自动播放

为了优化unity序列帧动画调用,此处不使用unity自带animation调用动画,自己编写了一个类似animation动画的可以插入事件的序列帧动画脚本,可以是image或者是spriterender using UnityEngine; using UnityEngine.Events; using UnityEngine.UI; /**************************************************** 作者:cg 功能:图片序列帧动画 *************

cgExplorer的博客 1741

从共现矩阵到共现图一步到位——详解版

1.共现矩阵 判断大量不同文本之间,相邻词的联系,两词在所有文本中相邻的次数在矩阵中用数值表示。(参考此) 例子如下: 1.1 文本 • I like deep learning. • I like NLP. • I enjoy flying. 1.2 共现矩阵 2.共现图 2.1 数据预处理(节点和边) 获取文件node.csv和edge.csv。代码详见github仓库 2.2 共现图的制作 2.2.1 gephi的安装(参考此) (1)先下载gephi (2) 再配置java环境(下载java1.8

微乐的博客 4401

labview设置工业摄像头外部触发

使用labview对海康MV-CA013-GM相机设置外部触发。 一、硬件部分 1、硬件引脚定义 2、触发模式设置 相机的触发模式分为两种,一种是内触发模式、另外一种是外触发模式。 3、接线图 信号线的地要跟给信号的设备共地。信号线给高电平时触发拍照。 二、软件部分 1、创建vision acquisition 2、选择使用的摄像头。 3、选择模式。 4、在Acquisition Control中设置这些选项。 5、设置保存图片路径 设置保存路径和保存图片的格式。点击完成即可 参考:https:/

qq_43493715的博客 5665

Unity_AVPro_实现手指滑动序列帧播放

我使用了AVPro 视频播放插件 AVPro下载地址及资料:https://blog.youkuaiyun.com/weixin_42137574/article/details/102610791 还用了EasyTouch插件 EasyTouch 可以在Unity的 Asset Store里 搜索下载 有免费版的 不废话直接上代码: using System.Collections.Generi...

weixin_42137574的博客 1409

模仿学习(Imitation Learning)概述

什么是模仿学习呢?简单来说,模仿学习(Imitation Learning),就是要训练机器能够复制人类的连续动作,进而达到模仿的目的。其实,Imitation Learning的实用性很高,假设今天有一个训练场景,你不知道该怎么定奖励值(reward),但是你可以收集到专家的示范数据(expert demonstration data),你就可以考虑用Imitation Learning这个方法。因此,模仿学习也被寄予很高的期待,成为下一代强人工智能的关键技术。......

qq_22749225的博客 2万+

Unity自定义组件之序列帧播放组件

我们知道在unity中播放序列帧动画有两种方式,第一种是利用Unity自带的animation组件来播放,我们只需要在工程目录中全选选中所有我们需要播放的图片,将其拖动到Hiercarchy上,Unity就会帮我们自动创建一个animation片段,我们就可以用animation组件来控制我们的动画,不过这种方式创建的图片Sprite Renderer类型的。第二种方式就是创建一个Image组件,利用代码创建一个sprite,写一段代码利用Update函数来逐帧替换Image的sprite来实现动画的播放。

weixin_43956644的博客 1347

YOLOv11改进 ,YOLOv11改进主干网络为MobileNetV3,助力涨点

MobileNetV3通过结合硬件感知网络架构搜索(NAS)和NetAdapt算法,通过新颖的架构改进进一步提升了性能。本文开始探讨了自动化搜索算法与网络设计如何协同工作,以利用互补方法来提升整体技术水平。通过这一过程,创建了两个新的MobileNet模型:MobileNetV3-Large和MobileNetV3-Small,分别针对高资源和低资源使用场景。这些模型随后被适配并应用于目标检测和语义分割任务。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1934

【实战】小红书笔记爬虫终极指南:模拟滑动加载,抓取图文(2026最新版)

小红书作为国内最大的生活方式分享社区,每天产生海量的图文笔记。对于数据分析、市场调研、竞品分析等需求,爬取小红书公开笔记成为一项常见任务。然而,小红书的反爬机制日益升级——接口加密、动态Token、滑动验证、设备指纹……本文将深入剖析小红书Web端和App端的爬取技术,手把手教你用Python实现模拟滑动加载、自动抓取图文笔记的完整爬虫系统。全文包含大量代码、原理分析和排坑经验,适合有一定爬虫基础的读者进阶学习。目录前言一、小红书反爬机制概览二、环境准备2.1 Python环境2.2 浏览器驱动。

2201_76125261的博客 766

unity 序列帧播放

[SerializeField] private Image m_ScreenImage; //序列帧播放的image [SerializeField] private int m_FrameRate = 30; // 一秒播放的帧数 [SerializeField] priva...

weixin_30558305的博客 256

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

⭐ Unity 序列帧播放脚本

序列帧播放脚本

惊鸿醉的博客 1102

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

随笔-Unity中播放序列帧动画

在使用NGUI的播放序列帧动画组件时,在切出主程序再回来时会出现快速播放的问题。。所以自己写了一套基于NGUI的播放序列帧动画组件 using UnityEngine; using System.Collections; using System.Collections.Generic;...

chuaikua1491的博客 379

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Unity自定义序列帧播放器

主要解决Animator针对序列帧动画控制重新播放和指定帧播放这些操作上的不方便

qq_27050589的博客 910
上一篇: Unity(可编辑,可输入)下拉选择框,带文本联想。
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值