【Unity3D】GIF与序列帧动画的使用

2D游戏实质上就是图层叠图层的过程,在一张巨大的图层中,不停播放动画的过程。因此,序列帧动画和GIF在2D中占据真很重要的地位。如果拿Unity3D制作2D游戏,由于Unity3D不接受GIF动画,所以动画要按照最原始的游戏制作方式,利用序列帧大图完成。在《【Photoshop】合并一系列序列帧图片成序列帧大图》(点击打开链接)中,我曾经提到如何用常用的图片处理软件Photoshop cc将GIF图片转化为序列帧大图。下面则用一个例子来说明Unity3D中如何使用序列帧大图。本文不使用NGUI,用原生的UGUI。

如下图一张序列帧大图aa.png:


要最终在Unity3D完成如下简单的动画播放效果。可以用两个按钮来控制动画的播放。


和原本这张序列帧大图所代表的GIF是无异的!


一、场景布置

1、首先我们先新建一个2D游戏,而不是3D。如果是在做3D游戏,还用啥序列帧大图和GIF?当然要上骨骼动画了!


其实在Unity3D中2D和3D游戏制作中,最大的区别是主摄像机Main Camera的投影从发散投影perspective,变成了如下图的平行正射orthographic。让玩家从视觉上发生了深刻的改变。其余没什么区别,可以打开2D界面尽情创作。2D游戏还有一个好处,就是开发成本低,搞个GIF总比你搞个3D模型快多了,而且还不用考虑灯光这些奇奇怪怪的东西。


2、之后,我们在场景新建一个Sprite,同时在UI的已设置适应主摄像机的Canvas布置两个按钮一个PlayButton,一个StopButton,并在旗下的Text改名。

(1)对于Canvas,需要先设置贴合摄像机。


(2)之后再创作如下的UI。


3、接下来在Assets中新建一个Resources,放入我们的序列帧大图aa.png。


aa.png的属性设置如下,同时打开切割器Sprite Editor。


4、由于这张序列帧大图aa.png我自己很清楚是由一堆64x64的图片拼接出来的。所以在Type中选择网格Grid之后,像素Pixel Size输入64x64,直接完成即可。


则得到如下的局面。


二、脚本编写

直接给New Sprite赋予如下脚本。实质上在控制哪个毫秒,精灵New Sprite上放的是那张图片而已。这里没有使用Update()这个父进程去播放动画,利用一个协程对应一个GIF的控制,我认为更合适。关于Unity3D配合C#的协程使用,具体可以参考《【Unity3D】协程Coroutine的运用》(点击打开链接)。

这里唯一一个注意点是,大家可以看到,原来GIF只有46帧,序列帧大图是按8x8共64帧来配置的,所以注意会有空白,因此,在协程中要求播到46帧,则马上从0开始。

在协程中,停顿时间为1/fps秒,fps为刷新频率,也就是帧数,原始游戏是30,高清时代是60,现在貌似去到75,这个自己定好就行。

实质上本程序来来去去都是spriteRenderer.sprite = sprites[i];控制当前是数组那个元素而已,其实没有什么技术含量。

using UnityEngine;
using System.Collections;

public class AnimationController : MonoBehaviour
{

    private Coroutine AnimationPlay;//播放协程
    private Sprite[] sprites;//被切割的序列图数组
    private SpriteRenderer spriteRenderer;//精灵控制器

    void Start()
    {
        sprites = Resources.LoadAll<Sprite>("aa");//载入资源aa.png
        spriteRenderer = GetComponent<SpriteRenderer>() as SpriteRenderer;//这东西在精灵身上自带的,直接拿就行
    }

    void Update()
    {

    }

    //按钮动作
    public void PlayButtonOnClick()
    {
        AnimationPlay = StartCoroutine(AnimationPlayThread(30));
    }
    public void StopButtonOnClick()
    {
        StopCoroutine(AnimationPlay);
    }

    //实质在控制什么时候在精灵上放那张被切割的小图而已
    IEnumerator AnimationPlayThread(float fps)
    {
        int i = 0;
        while (true)
        {
            if (i < 46)
            {
                spriteRenderer.sprite = sprites[i];
                i++;
            }
            else
            {
                i = 0;
            }
            yield return new WaitForSeconds(1 / fps);
        }
    }

}

最后像《【Unity3D】场景切换、UGUI组件事件、开始游戏与关闭游戏》( 点击打开链接)一样,指定两个按钮PlayButton、StopButton的点击事件分别是这里的PlayButtonOnClick()和StopButtonOnClick()则大功告成了!


  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity 默认不支持 GIF 格式的动画,但是可以通过导入第三方插件来实现 GIF 动画的加载和播放。 以下是两个比较常用的插件: 1. GifDecoder:可以在 Unity 中直接加载 GIF 文件,并返回一个 Texture2D 对象,可以将其赋值给 RawImage 或者 Sprite 等组件来实现播放。GifDecoder 插件的 GitHub 地址为:https://github.com/DataB4/GifDecoder。 2. SimpleGif:是一个功能强大的 GIF 解码库,支持解码、播放和编码 GIF 文件,并且提供了丰富的 API 接口供用户使用。SimpleGif 插件的 GitHub 地址为:https://github.com/marijnz/SimpleGif。 这里以 GifDecoder 插件为例,演示如何加载 GIF 动画: 1. 从 GitHub 上下载 GifDecoder 插件,并将其导入到 Unity 项目中。 2. 在需要加载 GIF 动画的场景中,创建一个 RawImage 对象,并将其命名为 gifImage。 3. 编写以下代码: ```csharp using UnityEngine; using System.Collections; using GifDecoderNamespace; public class GifDecoderTest : MonoBehaviour { public Texture2D[] gifFrames; public float fps = 10f; void Start () { // 从 Resources 文件夹中加载 GIF 文件 TextAsset gifFile = Resources.Load("yourGifFile") as TextAsset; // 调用 GifDecoder 插件解码 GIF 文件 GifDecoder gifDecoder = new GifDecoder(); gifDecoder.Decode(gifFile.bytes); // 获取 GIF 动画的帧数 int frameCount = gifDecoder.GetFrameCount(); gifFrames = new Texture2D[frameCount]; for (int i = 0; i < frameCount; i++) { // 获取指定帧的 Texture2D 对象 gifFrames[i] = gifDecoder.GetFrameTexture(i); } // 播放 GIF 动画 StartCoroutine(PlayGifAnimation()); } IEnumerator PlayGifAnimation() { while (true) { // 遍历 GIF 动画的所有帧 for (int i = 0; i < gifFrames.Length; i++) { // 将当前帧显示在 RawImage 组件中 RawImage gifImage = GetComponent<RawImage>(); gifImage.texture = gifFrames[i]; // 等待一定时间后切换到下一帧 yield return new WaitForSeconds(1f / fps); } } } } ``` 根据需要,你可以调整代码中的参数来控制 GIF 动画的播放速度和循环方式等。请将 `yourGifFile` 替换为实际的 GIF 文件名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值