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


概述

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

注意:本文关注的是那种多张图切换的动画,如果需要类似于 Spine 那种形变动画可以看我的另外一篇文章:【Unity】在Unity 3D中使用Spine开发2D动画

播放序列帧动画

准备图片

首先将你所有的图片都导入到项目中,然后在 Project 视窗选中你所有的图片并将其 Texture Type 改为 Sprite(2D and UI),然后确保 Sprite Mode 为 Single 。
如图:
在这里插入图片描述

准备脚本代码

using System.Collections;
using UnityEngine;
using UnityEngine.UI;

namespace Core
{
    /// <summary>
    /// 序列帧动画播放器
    /// 将该脚本挂载到拥有Image组件的GameObject下即可
    /// framesPerSecond用于调节每一秒播放的帧数
    /// sprites用于存放每一帧的图片
    /// <remarks>开发者 : Genesis (*╹▽╹*) </remarks>
    /// </summary>
    public class SequenceFramePlayer : MonoBehaviour
    {
        /// <summary>
        /// 每秒播放的帧数
        /// </summary>
        public float framesPerSecond = 10.0f;
        
        /// <summary>
        /// 存储序列帧动画的所有帧
        /// </summary>
        public Sprite[] sprites;

        private Image _image;

        private void Start()
        {
            _image = GetComponent<Image>();
            StartCoroutine(PlayAnimation());
        }

        private void OnEnable()
        {
            StartCoroutine(PlayAnimation());
        }

        private IEnumerator PlayAnimation()
        {
            while (true)
            {
                for (var i = 0; i < sprites.Length; i++)
                {
                    if (_image != null)
                    {
                        _image.sprite = sprites[i];
                    }
                    yield return new WaitForSeconds(1f / framesPerSecond);
                }
            }
        }
    }
}

处理场景

在场景中建立一个 Image ,或者给你的UI组件添加一个 Image 组件也行。
在这里插入图片描述

使用脚本

将脚本 SequenceFramePlayer 挂载到刚才的 Image 游戏对象上,并将图片拖拽到 Sprites 中,友情提示:Inspector 右上角有个小锁头,我们可以先选中 Image ,然后点击锁定,然后再去使用 Shift 批量选中图片进行拖拽,这样会方便很多。

Frames Per Second 属性是用来调节速度的,也就是每秒钟播放多少张图片。

在这里插入图片描述

播放图集动画

修改设置

首先要更改一下设置,操作步骤为 Edit -> Project Settings -> Editor ,将 Sprite Packer -> Mode 设置为 V1 Always 或者 V2。

修改图片资源类型

注意:此处跟前面略有不同,需要将 Mesh Type 设置为 Full Rect 。
在这里插入图片描述

创建 Sprite Atlas

在 Projects 中创建一个 Sprite Atlas ,如下图:
在这里插入图片描述
将图集拖放到 Sprite Atlas 的 Objects for Packing 中,然后点击下方的 Pack Preview 按钮进行预览。
在这里插入图片描述

准备脚本

using System.Collections;
using UnityEngine;
using UnityEngine.U2D;
using UnityEngine.UI;

namespace Core
{
    /// <summary>
    /// 图集动画播放器
    /// 将该脚本挂载到拥有Image组件的GameObject下即可
    /// framesPerSecond用于调节每一秒播放的帧数
    /// spriteAtlas需要制定创建好的SpriteAtlas
    /// <remarks>开发者 : Genesis (*╹▽╹*) </remarks>
    /// </summary>
    public class SpriteAtlasPlayer : MonoBehaviour
    {
        /// <summary>
        /// 每秒播放的帧数
        /// </summary>
        public float framesPerSecond = 10.0f;

        public string prefix;
        
        /// <summary>
        /// 存储序列帧动画的所有帧
        /// </summary>
        public SpriteAtlas spriteAtlas;

        private Image _image;

        private void Start()
        {
            _image = GetComponent<Image>();
            StartCoroutine(PlayAnimation());
        }

        private void OnEnable()
        {
            StartCoroutine(PlayAnimation());
        }

        private IEnumerator PlayAnimation()
        {
            while (true)
            {
                for (var i = 0; i < spriteAtlas.spriteCount; i++)
                {
                    if (_image != null)
                    {
                        _image.sprite = spriteAtlas.GetSprite($"{prefix}{i}");
                    }
                    yield return new WaitForSeconds(1f / framesPerSecond);
                }
            }
        }
    }
}

使用脚本

与前面的设置基本相同,只不过这次不需要拖动图片,而是直接将刚才创建的 Sprite Atlas 文件放进来即可。
在这里插入图片描述


更多内容请查看总目录【Unity】Unity学习笔记目录整理

### 创建和使用序列帧动画Unity创建并使用序列帧动画可以通过多个途径完成,这里主要描述基于`Animation`系统的实现方法[^1]。 #### 准备工作 为了准备序列帧动画素材,需先准备好一系列按照时间顺序排列的图片文件。这些图片代表了动画的不同瞬间状态,通常命名为带有编号的形式以便于识别其播放次序,例如frame_0.png, frame_1.png等。 #### 导入资源到项目 将上述准备好的图片拖拽至Unity项目的Assets目录下,确保它们被正确导入为Sprite类型的纹理。接着,在Inspector面板内调整Texture Type选项为Sprite (2D and UI),并且启用Read/Write Enabled属性以允许运行时修改材质数据。 #### 设置Sprite Atlases(可选) 如果希望优化性能或减少Draw Call次数,则可以考虑创建Sprite Atlas来打包所有的单张图片成一张大图集。这一步不是必需的操作,但对于提高效率很有帮助。 #### 构建Sequence Animation Clip 对于想要利用内置的`Animation`组件来进行序列化展示的情况: - 添加一个空的游戏物体作为载体,并为其挂载`Animator`及`Animation`两个组件; - 新增一个名为`FrameSequence`的新剪辑(Animation Clip); - 进入该剪辑编辑模式后,依次向轨道上添加各个时刻对应的sprite变化事件;此时可通过右键菜单选择Add Keyframe手动指定具体时间节点处应显示哪一帧的画面; - 完成配置之后保存更改退出编辑器即可得到完整的序列帧动画片段。 ```csharp using UnityEngine; public class SequencePlayer : MonoBehaviour { private Animator animator; void Start() { animator = GetComponent<Animator>(); // 开始播放特定名称下的动画序列 animator.Play("FrameSequence"); } } ``` 当涉及到更复杂的交互逻辑或是动态加载不同组别的序列帧时,可能还需要编写额外的C#脚本来辅助管理切换过程的细节处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值