简单的范例

如上图,在等待使用者作答时,播放左右晃头的等待动画,使用者作答时,判断答对或答错,分别播放不同的动画及音效。播放完毕,继续左右晃头。

图片制作

左右晃头要准备三个状态的图,分别为摆左、正中及摆右,但播放时要依正中 → 摆左 → 正中 → 摆右 → 正中 → 摆左→ 正中→…的顺序播放,感觉才自然。

可以三张图分别存檔,也可以合成一张。若是合成一张图,那么就得在 Unity 中分割。

图片切割

  1. 将图片导入项目中,然后设置图片的 Sprite Mode为〝Multiple〞。
  2. 单击〝Sprite Editor〞打开 Sprite Editor 工具。点选 Slice ,然后将 Type 更改为〝Grid By Cell Count〞,接着设定Column & Row,将图片等分成三张。
  3. 最后按下〝Apply〞即可。
  4. 分割后的名称会自动被标上 _0, _1, _2, …等。

创建 Sprite 对象

  1. 依次单击〝GameObject → 2D Object → Sprite〞创建一个空的 Sprite 对象。
  2. 设定 Sprite Renderer 的 Sprite,然后单击〝Add Component〞添加脚本。
  3. 将这个脚本命名为〝Boy.cs〞,负责操控这个对象的一些动作。Boy 是一个类别,代表整个场景中,可以不只一个 Boy 对象,但都符合相同的动作要求。

Boy 类的设计

这个类别需要四张 Sprite,用于显示等待动画。除此之外,也得设定一秒要播放几张?

代码如下:

public class Boy : MonoBehaviour {public Sprite[] arySprite;   // 存放图片public float framesPerSec;   // 每秒几张private SpriteRenderer m_spriteRender;//---------------------------------------------------------void Start (){m_spriteRender = GetComponent<SpriteRenderer>();}//--------------------------------------------------------void Update (){int index = (int)(Time.time * framesPerSec) % arySprite.Length;m_spriteRender.sprite = arySprite[index];}//--------------------------------------------------------
}

设计好 Boy 类后,再回到刚才的 Sprite 对象,在 Script 部分会看到被宣告成 public 的变量,在此设定相对应的游戏对象。

注意图片的播放顺序,在此例中,设定一秒播放一张图。

答对、答错的动画制作

等待的动画,是在 Update() 中不断地更换图案制造出效果。答对或答错,事实上,也是更换不同组图案,更换时,再加上音效的播放。

由于有两种显示状态,所以必须添加一个 Status 变量,用于分辨目前处于何种状态,0 表等待中,1表播放对错的动画及音效,2表播放完毕。

看一下修改后的代码:

    void Update (){if (m_nStatus == 0) // 等待动画{int index = (int)(Time.time * framesPerSec) % arySprite.Length;m_spriteRender.sprite = arySprite[index];}else if(m_nStatus == 1)   // 答对、答错的动画及音效{m_nStatus = audioMgr.isPlaying ? 1 : 2;}}

在此例中,答对或答错只有一张图,所以没有更换 Sprite 的处理,只有判断音效是否播放完毕的处理。

Boy 类提供以下四个方法,以便应付需求:

ShowNormal() 停掉音效播放,进入等待动画的状态 ( Status = 0 )。

ShowCorrect() 播放答对动画,进入回馈动画的状态 ( Status = 1 )。

ShowWrong() 播放答错动画,进入回馈动画的状态 ( Status = 1 )。

IsPlayOver() 判断答对或答错动画是否播放完毕?

在场景中的应用

在此场景中,基本上会有如下的游戏对象:

其中 audioSound 是给 Boy 类用于播放音效的 Audio Source。theBoy 是挂有 Boy.cs 的 Sprite 对象,Boy 类会有几个 public 变量,需要外部设定给它。

把场景的主脚本 (Main.cs) 挂在 Main Camera 上,并在其中宣告一个 Boy 类的public 变量,然后指向 theBoy。

如此大功基本告成。

完整的代码如下:

public class Main : MonoBehaviour {public Boy theBoy;private int m_nStatus = 0;private int m_nWrong = 0;    //------------------------------------------------------------void Start (){}    //-----------------------------------------------------------void Update (){if( m_nStatus == 1 ){if (theBoy.IsPlayOver ){theBoy.ShowNormal();m_nStatus = 0;}}}    //------------------------------------------------------------//  答对public void btnCorrect_onClick(){m_nStatus = 1;theBoy.ShowCorrect();}    //------------------------------------------------------------//  答错public void btnWrong_onClick(){m_nWrong++;m_nStatus = 1;theBoy.ShowWrong(m_nWrong);}    //------------------------------------------------------------
}

Boy 类完整的代码如下:

public class Boy : MonoBehaviour {public Sprite[] arySprite;public Sprite[] aryWrongSprite;public float framesPerSec;public AudioSource audioMgr;public AudioClip[] aryAudioClip;private SpriteRenderer m_spriteRender;private int m_nStatus = 0;//------------------------------------------------------------void Start (){m_spriteRender = GetComponent<SpriteRenderer>();}//------------------------------------------------------------void Update (){if (m_nStatus == 0){int index = (int)(Time.time * framesPerSec) % arySprite.Length;m_spriteRender.sprite = arySprite[index];}else if( m_nStatus == 1){m_nStatus = audioMgr.isPlaying ? 1 : 2;}}    //------------------------------------------------------------//  判断音效是否播放完毕?public bool IsPlayOver{get { return m_nStatus == 2; }}   //------------------------------------------------------------public void ShowNormal(){m_spriteRender.sprite = arySprite[0];m_nStatus = 0;audioMgr.Stop();}//------------------------------------------------------------public void ShowCorrect(){m_spriteRender.sprite = aryWrongSprite[0];m_nStatus = 1;audioMgr.PlayOneShot(aryAudioClip[0]);}//------------------------------------------------------------        public void ShowWrong(int nWrong){int index = (nWrong > 3) ? 3 : nWrong;m_spriteRender.sprite = aryWrongSprite[index];m_nStatus = 1;audioMgr.PlayOneShot(aryAudioClip[index]);}//------------------------------------------------------------

Unity 2D 学习手札(六)Sprite 动画相关推荐

  1. Unity 2D 学习手札 (一) 基本概念

    前言 刚开始学习 Unity 2D,看了几本书,或许书中重点都不在 2D 的部分,总是不得其门而入,无法快速的上手,充满挫折.后来在网络上查了一些文章,东拼西凑,才慢慢体会其要意,今将心得记载于此,以 ...

  2. Unity 2D 学习笔记:游戏实例Sunnyland

    Unity 2D 学习笔记:游戏实例Sunnyland 01安装软件&导入素材 02编辑素材&Tilemap 03图层layer&角色建立 04角色移动 05角色方向& ...

  3. unity 2D游戏开发 制作帧动画的两种方法

    本小主在这里给大家分享一下unity 2D游戏开发中制作帧动画的两种方法. 比较简单,一学即会. 方法一: 是用代码控制: 先创建一个2D工程.导入图片资源,并设置texture的texture ty ...

  4. Unity Shader学习记录(18) —— Shader动画

    纹理动画 纹理动画在游戏中的应用非常广泛.尤其在各种资源都比较局限的移动平台上,我们往往会使用纹理动画来代替复杂的粒子系统等模拟各种动画效果. 11.2.1序列帧动画 _Time是float4类型, ...

  5. Unity Shader学习笔记 - 用UV动画实现沙滩上的泡沫

    这个泡沫效果来自远古时代的Unity官方海岛Demo, 原效果直接复制3个材质球在js脚本中做UV动画偏移,这里尝试在shader中做动画并且一个pass中完成: // Upgrade NOTE: r ...

  6. Unity 2D学习总结

    unity开发平台的使用 1.游戏对象 游戏对象的显示关系 游戏对象的轴心一般为游戏对象的几何中心,也可以进行人为更改 游戏对象的父子关系:将一个游戏对象挂载的另一个游戏对象下,子节点以父节点作为轴心 ...

  7. UNITY 2D学习笔记(二):C#脚本编写

    Update(更新帧): 简而言之:Update可以受到变速齿轮,机器性能影响 FixedUpdate用于刚体物理计算,不受影响 假设:处理高速物体或微观检测Edit->ProjectSetti ...

  8. 【Unity 3D学习】控制Animator动画从随机帧开始

    一.前提:游戏主场景有很多建筑,然后建筑上会有动画,如果存在多个同类型的建筑,就会出现多个相同动画频率一致的情况,这样子产品说体验性较差,所以考虑怎么控制动画从不同帧开始播放. 二.处理方案. 1.原 ...

  9. 关于Unity 2d动画实现

    本文转自:http://gamerboom.com/archives/76709 本文为游戏邦/gamerboom.com编译,拒绝任何不保留版权的转载,如需转载请联系:游戏邦 作者:Alex Ros ...

最新文章

  1. 必看,61篇NeurIPS深度强化学习论文解读都这里了
  2. 根据之前发的那SQL语句查询表结构的语句做了个MSSQL实体类生成器!
  3. 为什么淘宝、天猫和旺信的 App 不整合成一个?
  4. 数据量很大的排序问题 大量数据如何排序
  5. Java进阶书籍推荐,赶快收藏起来!
  6. 【翻译】How-To: Using the N* Stack, part 3
  7. Android之解决webview加载第三方网页点击弹不出下拉框(html页面里面的select标签)
  8. 一次SpringBoot AutoWired 注入服务为null的事件
  9. ajax调用后台java方法,jquery ajax再次封装,前台调用后台java方法直接返回数据
  10. 不小心合并了icloud通讯录_苹果手机号码被删除如何恢复?找回通讯录的具体步骤...
  11. 分享国外安全团队及工具
  12. YOLOv5电车识别 电瓶车识别
  13. 微信公众号订阅通知(go+vue)
  14. couldn't create PTY
  15. 这几个免费PPT模板、素材库,你绝对不能错过
  16. SecureCRT 多个会话显示在同一窗口
  17. 硬盘分区MBR和GPT选哪个好?原来分个区还有这么多讲究!
  18. 2022-2028全球与中国公共关系分析软件市场现状及未来发展趋势
  19. 搭建自己的以图搜图系统(二):深入优化搭建生产级别的图搜系统
  20. 虚拟机RedHatEenterpriseLinux5安装及Oracle10.2.0安装手记

热门文章

  1. Pycharm下载和安装教程(一看就会)
  2. Walden单词词频统计任务
  3. Android带渐变效果的圆角矩形Demo
  4. Mac软件推荐:NoMachine轻松带你远程控制桌面
  5. 江西省餐饮油烟治理在线监测平台的研究与应用 油烟监测系统 油烟监测云平台 (安科瑞-须静燕)
  6. 认识python教案,《认识python》优质教案、教学设计
  7. C语言整型,浮点型数据储存的超详细讲解
  8. HEVC(H.265)视频压缩编码格式与其原理
  9. Android 在相机加框,android自定义相机带取景框
  10. 《J2SE 回炉再造06》-------溺水狗