今天我给大家讲一下如何使用NGUI做序列帧动画。本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画。废话不说了,下面开始。
还要在啰嗦一句,首先大家要准备一些序列帧的素材图片,最好是大图和小图各一套。我们先来将使用UISpirit做序列帧动画,这个方法只适合使用小图。
在使用UISpirit 之前大家还要把准备好的序列帧图片做成Atlas,如何做Atlas,大家可以参考系列教程四,这里就不多说了。建好自己的Atlas之后就可以开始着手做了。废话终于完了。

1. 老规矩,新建一个场景,新建一个2D UI ,在Panel节点下新建一个UISpirit,图片选择序列帧的第一帧图片。

2.如何让Spirit动态换图片,是我们要解决的重要问题。只要UIspirit能够根据时间动态的换图片就可以做到播放序列帧动画。其实很简单,最重要的就是UISpirit的Name属性。我们只要能够动态改变UISpirit的SpiritName,就可以实现动态换图的功能。
代码如下

  1. public bool ActivateWait = false;
  2.  
  3. float fireRate = 0.2f;
  4. int i = ;
  5. float nextFire;
  6. string[] ActivatorTexture = new string[] { "activity00", "activity01", "activity02", "activity03", "activity04", "activity05", "activity06", "activity07", "activity08", "activity09", "activity10", "activity11" }; //这里存放我们需要调用的序列帧的名称,这种方法比较笨拙,
  7. //只适合使用图片较少的情况,当图片很多的情况下,我们可以使用代码控制名称,思路是前面的名称一样,后面的名称代表序列帧编号,我们只要
  8. //在代码中根据编号加上前缀名称就可以得到所需序列帧的全名。具体使用参见下面的Texture序列帧动画。
  9. void Awake()
  10. {
  11. this.GetComponent<UISprite>().enabled = false;
  12. }
  13.  
  14. // Use this for initialization
  15. void Start()
  16. {
  17.  
  18. }
  19.  
  20. // Update is called once per frame
  21. void Update()
  22. {
  23. if (ActivateWait)
  24. {
  25. this.GetComponent<UISprite>().enabled = true;
  26. if (i < ActivatorTexture.Length)
  27. {
  28. if (Time.time > nextFire)
  29. {
  30. nextFire = Time.time + fireRate;
  31. this.GetComponent<UISprite>().spriteName= ActivatorTexture;
  32. i++;
  33. }
  34. }
  35. else
  36. {
  37. i = ;
  38. }
  39. }
  40. else
  41. {
  42. this.GetComponent<UISprite>().enabled = false;
  43. }
  44. }

这里重要的代码其实就只有一句 this.GetComponent<UISprite>().spriteName= ActivatorTexture; 根据i的索引,动态的改变Spirit的名称。
其余的是控制播放序列帧的节奏和是否播放序列帧。如图是我使用此方法做的等待的进度条效果。

3.第二种方法,使用UITexture做序列帧动画。新建一个UITexture,拖放需要做动画的序列帧的第一帧到Texture槽中,关于它的参数,在以前的系列教程中都已经解释的很清楚了,大家可以参考以前的教程。使用UITexture做序列帧动画的关键在于动态改变它的Texture。关键代码:UITexture.mainTexture 。

这里说明一点就是使用该方法做序列帧动画之前,需要把所有的序列帧图片放到Resources目录下。我们在运行的时候动态调用需要的Texture。还有一点需要注意的是,当图片很多的时候,我们还需要动态卸载已经加载的图片资源,避免挤爆内存。使用的方法是 : Resources.UnloadUnusedAssets();

4.有了上面的知识之后,我们就可以动手写出下面的代码了:

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class AnimateTexture : MonoBehaviour
  5. {
  6.  
  7. public string SequenceName_Gewei = "Comp 1_0000";
  8. public string SequenceName_Shiwei = "Comp 1_000";
  9. public string SequenceName_Baiwei = "Comp 1_00";
  10. public int currentFrame;
  11. public int TargetFrame=;
  12. public UITexture TextureUI;
  13. float timeElipsed = 0.0f;
  14.  
  15. float fps = ;
  16. //public List<Texture2D> ani;
  17.  
  18. public int SequenceNum;
  19.  
  20. void Awake()
  21. {
  22. if (TextureUI == null)
  23. {
  24. TextureUI = this.GetComponent<UITexture>();
  25. }
  26.  
  27. }
  28.  
  29. // Use this for initialization
  30. void Start ()
  31. {
  32. }
  33.  
  34. // Update is called once per frame
  35. void Update ()
  36. {
  37.  
  38. AutoPlayTexture();
  39.  
  40. }
  41.  
  42. void AutoPlayTexture()
  43. {
  44. timeElipsed += Time.deltaTime;
  45. if (timeElipsed >= 1.0 / fps)
  46. {
  47. timeElipsed = ;
  48.  
  49. if (currentFrame < SequenceNum)
  50. {
  51. currentFrame++;
  52. }
  53. else
  54. {
  55. currentFrame = ;
  56. }
  57. DynamicLoadUnload(currentFrame);
  58. }
  59.  
  60. }
  61.  
  62. //This function can dynamic load Unload textures from 0 to at least 1000,param currentFrame play;
  63. void DynamicLoadUnload(int curframe )
  64. {
  65. //plane.renderer.material.mainTexture=ani[currentFrame];
  66. if (curframe < )
  67. {
  68. TextureUI.mainTexture = (Texture2D)Resources.Load(SequenceName_Gewei + curframe.ToString(), typeof(Texture2D));
  69. }
  70. else if (curframe >= && curframe < )
  71. {
  72. if (curframe % == )
  73. Resources.UnloadUnusedAssets();
  74.  
  75. TextureUI.mainTexture = (Texture2D)Resources.Load(SequenceName_Shiwei + curframe.ToString(), typeof(Texture2D));
  76. }
  77. else
  78. {
  79. if (curframe % == )
  80. Resources.UnloadUnusedAssets();
  81.  
  82. TextureUI.mainTexture = (Texture2D)Resources.Load(SequenceName_Baiwei + curframe.ToString(), typeof(Texture2D));
  83. }
  84. }
  85.  
  86. }

NGUI系列教程七(序列帧动画)的更多相关文章

  1. (转)NGUI系列教程七(序列帧动画UITexture 和 UIsprit)

    NGUI系列教程七(序列帧动画)   今天我给大家讲一下如何使用NGUI做序列帧动画.本节主要包括两方面内容,分别是使用UIspirit和使用UITexture 做序列帧动画.废话不说了,下面开始.还 ...

  2. CRL快速开发框架系列教程七(使用事务)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  3. ASP.NET 5系列教程(七)完结篇-解读代码

    在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...

  4. NGUI系列教程五(角色信息跟随)

    在一些网络游戏中,我们常常可以看到角色的上方显示着角色的名称,等级,血量等信息.它们可以跟随角色移动,并且可以显示和隐藏.今天我们就来学习一下这些功能的实现方法.1. 新建unity工 程,导入NGU ...

  5. NGUI系列教程四(自定义Atlas,Font)

    今天我们来看一下怎么自定义NGUIAtlas,制作属于自己风格的UI.第一部分:自定义 Atlas1 . 首先我们要准备一些图标素材,也就是我们的UI素材,将其导入到unity工程中.2. 全选我们需 ...

  6. NGUI系列教程三

    接下来我们再来看Progress Bar和Slider,对比参数我们可以发现,Progress Bar和slider的明显区别在于slider多一个Thumb选项,这里的Thumb就是我们拖动的时候点 ...

  7. NGUI系列教程二

    接下来我们创建一个Label,NGUI->Open the Widget Wizard,打开widgetTool对话框,在Template中选择Label,确定AddTo右侧选项为panel,点 ...

  8. 黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block

    原文:黄聪:Microsoft Enterprise Library 5.0 系列教程(七) Exception Handling Application Block 使用企业库异常处理应用程序模块的 ...

  9. webpack4 系列教程(七): SCSS提取和懒加载

    教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步>>> (原文)webpack4 系列教程(七): SCSS 提取和懒加载. 个人技术小站: https://god ...

随机推荐

  1. 【我要学python】函数的系统学习

    我的短期目标:python+CTF reverse 一起加油! #1,函数介绍 1,功能性 函数目的 2,隐藏性 (封装) (避免写重复代码) 例: #round为保留小数的函数 a = 3.1415 ...

  2. Docker应用系列(三)| 构建Consul集群

    本示例基于Centos 7,在阿里云的三台机器上部署consul集群,假设目前使用的账号为release,拥有sudo权限. 由于Docker官方镜像下载较慢,可以开启阿里云的Docker镜像下载加速 ...

  3. 【JAVAWEB学习笔记】网上商城实战4:订单模块

    今日任务 完成订单模块的功能 1.1      订单 模块的功能 1.1.1    我的订单: [我的订单的查询] * 在header.jsp中点击我的订单. * 提交到Servlet: * 获得用户 ...

  4. python 什么是全局解释器锁GIL

    什么是全局解释器锁GIL Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在 ...

  5. ssvm和console 模板机 连接不上管理节点

    说明: cloudstack 版本http://www.shapeblue.com/packages/    并不是官方的 systemvm64template-4.6.0-vmware.ova  官 ...

  6. Django错误大汇总

    1.安装django报错解决方案 找到第一条报错信息: File "c:\users\chenwei\envs\testvir2\lib\site-packages\pip\basecomm ...

  7. UI/GUI/UE/UX/ID/UED/UCD的区别

    简述: UI (User Interface):用户界面 UE (User Experience):用户体验 ID (Interaction design):交互设计 UID (User Interf ...

  8. hdu 3642 体积并

    题意:求三个矩形体积的并 链接:点我 枚举z #include<stdio.h> #include<iostream> #include<stdlib.h> #in ...

  9. hdu 5207 Greatest Greatest Common Divisor 数学

    Greatest Greatest Common Divisor Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/ ...

  10. URL资源跨域访问 跨域使用session信息

    SilverLight 出于对安全性的考虑默认情况下对URL的访问进行了严格的限制,只允许访问同一子域下的URL资源. 下表列出了Silverlight 2.0 中 URL 访问规则:   WebCl ...