【转】通过制作Flappy Bird了解Native 2D中的Sprite,Animation
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明。如果你喜欢这篇文章,请点【推荐】。谢谢!

引子
上一次我们讲了MonoBehaviour的前世今生,了解了游戏中的每一个GameObjec都是由脚本控制的,这一次我们开始将Unity中Native 2D中的Sprite,并且使用Animation来让Sprite动起来。
在接下来的几篇博客里,我会通过做一个Flappy Bird来讲解Unity中各个组件的使用,项目的源代码在这里:Unity Flappy Bird。欢迎各位前去Fork和Star。
如何创建Sprite
创建一个Sprite可以遵循如下步骤
- 将一张图片拖动到Project视图中的某个文件夹的方式来添加Sprite资源。
- 修改Sprite资源的各项属性,如果是SpriteSheet的话还要对它在Sprite Editor中进行分割。
- 将Sprite资源拖动到Scene视图中,或者按住ctrl键同时选中SpriteSheet中的几张图片拖动到Scene视图中,这种方式会同时创建出一个动画。
创建Sprite的过程中请注意:
- Sprite是作为Sprite Renderer组件的一个属性来添加到一个GameObject中的。
- 在Sprite Renderer中的Sorting Layer属性允许你设置Sprite被渲染的优先级。
- SpriteRenderer使用在Sprite属性中的Texture, 但是使用Material中的Shader(着色器) ,默认选择的Sprites/Default 这种Shader是忽略光照的,而Sprites/Diffuse 这种Shader则是不会忽略光照的。如果你将Material设置为None时,你会发现无法显示Sprite,因为你没有对这个Sprite进行着色。
Sprite的详细设置

SpriteSheet:顾名思义,就是指把多个Sprite放到一张图片里。一般是把一段帧动画放在一张图片里面,游戏引擎会将这个SpriteSheet进行分割,轮流播放SpriteSheet中的每一帧,形成一个动画序列。如下图:
对应上图中的1, 2, 3三点,我分别说一下注意事项
- 当Sprite Mode为Single时,可以在Inspector中设置Sprite的pivot point,如果你以前使用过Cocos2d-x的话,就会知道其实这个pivot point就相当于Cocos2d-x中的anchor point。在Scene中,我们会以这个pivot point为中心,来对Sprite进行旋转,平移等Transform的设置。如果你使用的是SpriteSheet的话 ,可以在Sprite Editor中对每一个Sprite进行pivot的设置。
- 由于在Unity中的距离单位是Unit,为了保证3D与2D的一致性,所以在2D游戏中,我们也使用Unit作为计量单位。Pixel to Units几位这一转换比例。比如一张宽度为100的Sprite图片,在Scene中显示的长度为1Unit。
- 在Sprite Editor中可以进行Automatic和Grid两种形式的切割,一般来说,Automatic就已经可以比较好的解决问题了,一旦遇到我们需要几张Sprite图片大小一致时,可以使用Grid(网格)切分,来限制每个Sprite的大小。
如何为Sprite添加一个Animation
有两种方式可以创建动画,一种是我们上边说过的,将SpriteSheet中的几个Sprite同时拖动到Scene视图中。
另一种则是在Scene视图中,选中想要添加动画的GameObject,然后在Animation视图中,点击Add Curve来对GameObject的各种属性进行动画播放。
在Unity中,Animation是一个比较宽广的概念,并不局限于帧动画。它包括了GameObject的各种属性的动态变化。如果你点击了Add Curve之后,你会看到这样的界面:

在上面的图片里你可以发现从Position到Color,从Rotation到Sprite都是可以进行Animation的,因为在Unity中的Animation实际上是在添加一个变化曲线。而不是我们普遍理解的Animation。
另一个要解释的就是Animator和Animation的区别,要注意,如果想躺一个Animation动起来,那么一定需要两个Assest资源,分别是Animation Clip和Animator Controller两种资源。在Project中是以下的表现形式:

animator是一个动画状态机,它控制了各个Animation之间的切换。在后面的博客中我们会讲到它的使用。=w=
Animation的详细设置

我在上面的图中,把Animation视图中的一些重要的案件在图中标注出来了。
- 关键帧是Animation的转折点,你会在这一帧处设置一些Sprite的变化点,或者是Position这种数据的转折点。
- 动画事件可以在动画的某一帧设置,在这一帧可以设置的所谓动画事件即是这一GameObject上所有脚本组件的非重载函数(即排除掉OnUpdate,Start之类的函数)。设置完动画事件之后。你会发现每次动画循环一遍,这个函数都会在该帧被调用。
- 增加一条变化曲线,上文中说道,可以对任意属性进行变换。
- Sample指的是取样,即在1s内设置多少帧,在图中我们可以看到1s的间隔中有12个虚线,代表的就是在这一秒中,我们设置了12帧来调节动画。注意这里的sample和我们为游戏设置的刷新帧率是没有关系的。
总结
总的来说,在Unity的Animation中编辑动画 是非常方便的,和以前使用Cocos2d-x编辑动画时,有种鸟枪换炮的感觉。但是对Sprite本身的支持 还是令人有些不爽,因为做2D时,还是不习惯Unity中德坐标体系,因为制作2D游戏的我们经常害死会把像素Pixel当成是最重要的度量单位,Unity换成了Unit为单位之后,感觉有些不知所措,不过这就是3D引擎思考方式的一种变化吧。
参考资料
【转】通过制作Flappy Bird了解Native 2D中的Sprite,Animation的更多相关文章
- 【Unity3D基础教程】给初学者看的Unity教程(三):通过制作Flappy Bird了解Native 2D中的Sprite,Animation
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 上一次我们讲了MonoBehaviou ...
- 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...
- 【转】通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider
作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...
- canvas 制作flappy bird(像素小鸟)全流程
flappy bird制作全流程: 一.前言 像素小鸟这个简单的游戏于2014年在网络上爆红,游戏上线一段时间内appleStore上的下载量一度达到5000万次,风靡一时, 近年来移动web的普及为 ...
- 用Phaser来制作一个html5游戏——flappy bird (二)
在上一篇教程中我们完成了boot.preload.menu这三个state的制作,下面我们就要进入本游戏最核心的一个state的制作了.play这个state的代码比较多,我不会一一进行说明,只会把一 ...
- 用Phaser来制作一个html5游戏——flappy bird (一)
Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如何用Phaser来制作一个前段时间很火爆的游戏:Flappy Bird,希 ...
- 通通制作Html5小游戏——第二弹(仿flappy bird像素鸟)
亲爱的博友们,我又回来啦~因为我们技术宅的思想只有技术宅懂得,好不容易写了点好玩的东西发QQ空间,结果只有11的UV,0回复....10分钟ps一个女神的素描效果发QQ空间朋友圈,一大堆回复加赞,作为 ...
- 第一次学习手游开发:Flappy Bird制作
周末有空,学习下手游开发,因为本人压根没有基础,于是找了个视频,跟着教程撸了个Flappy Bird. 感谢 SwiftV课堂 提供的教学视频 源码地址: https://github.com/phe ...
- 【教程】HTML5+JavaScript编写flappy bird
作者: 风小锐 新浪微博ID:永远de风小锐 QQ:547953539 转载请注明出处 PS:新修复了两个bug,已下载代码的同学请查看一下 大学立即要毕业了. ...
随机推荐
- apache以天为单位生成日志
编辑/etc/httpd/conf.d/vhost.conf,修改ErrorLog和CustomLog: ErrorLog "|rotatelogs /var/log/httpd/phpdd ...
- js字符串内容包含单引号‘’和双引号“”怎么办?
如果javascript中的字符串包含单引号和双引号,可以用转义字符来标识 'I\'m \"OK\"!'; 表示的字符串内容是:I'm "OK"! 转义字符\可 ...
- Java +安卓 定时任务
1.android 自带闹钟定时任务 安卓闹钟可以配合广播来实现(不推荐),系统资源浪费,安卓系统在5.0以后的定时 任务貌似触发时间不准了,因为了为了省电. //获取系统闹钟 AlarmManage ...
- 协程实现tcp两个客户端的通讯
import socket import gevent from gevent import monkey monkey.patch_all() def cb_work(recv_num,send_n ...
- Python变量、赋值及作用域
## 变量 - 指向唯一内存地址的一个名字 - 目的是为了更方便地引用内存中的值 - 可以使用id(变量)函数来查看变量的唯一id值,若两者id值相同,则表示两个变量指向同一地址,两个变量的值完全相同 ...
- Laravel系列 Web
一.Homestead准备 上一篇文章已经对它的配置进行了说明,下面对Homestead.yaml进行说明 --- ip: "192.168.10.10" memory: 2048 ...
- php-语言参考-基本语法3.1
一,PHP代码的开始和结束标记 1,<?php 和 ?> //重点 2,<script language="php"> 和 </script> ...
- JZOJ 5919. 逛公园
Description 琥珀色黄昏像糖在很美的远方,思念跟影子在傍晚一起被拉长……Description 小 B 带着 GF 去逛公园,公园一共有 n 个景点,标号为 ...
- C语言实例解析精粹学习笔记——28
实例28:从键盘读入实数 题目要求: 编制一个从键盘读入实数的函数readreal(double *rp).函数将读入的实数字符列转换成实数后,利用指针参数rp,将实数存于指针所指向的变量*rp. 思 ...
- 查找并绘制轮廓 opencv
findContours(): 第二个参数为一个检测到的轮廓,函数调用后的运算结果都放在这里,每个轮廓存储为1个点向量,用point类型的vector表示. 第三个参数表示轮廓数量,包含了许多元素.每 ...
