`
duoerbasilu
  • 浏览: 1479261 次
文章分类
社区版块
存档分类
最新评论

Unity3D+免费工具开发2D游戏之三:创建人物动画

 
阅读更多

原文地址:http://www.rocket5studios.com/tutorials/make-a-2d-game-with-unity3d-using-only-free-tools-part-3/


原版翻译,转载请注明出处:http://blog.csdn.net/ariel7321/article/details/7777157


本节中,我们将加入主角、挂钩一些脚本、给梯子和绳索添加碰撞,最后主角可以在这个关卡里移动。

点击这里查看本节完成后的效果:点我!


制作主角的精灵图集


如果你跟着我这个教程,你肯定会为主角的移动而兴奋,因此我们用TexturePacker先制作一个精灵图集。


Download the source sprite .png’s,解压到项目中。如果你在第二节中已经做过了就跳过此步骤。

打开TexturePacker ,并将sprites/player目录下的所有.png文件都拖到Sprites面板中。


Texture Settings / Layout:

  • Algorithm设置成Basic。
  • Border Padding设置为1.
  • Shape Padding设置为1.
  • 不勾选Trim。

Texture Settings / Output:

  • 保留Data格式为cocos2d。
  • 在Data File中,点击...,将输出保存到项目的Assets下(我保存在Assets/SpriteAtlases),保存为“player”。
  • TexturePacker 自动给文件加了后缀.plist,但是Unity需要.xml文件,因此我们将.plist改为.xml。
  • Texture File路径应该也被设置成和Data File一样的了。
如果你按照我上面的步骤去做,TexturePacker的设置就如下图所示:


如果你点击Publish,然后切换到unity你就会在项目视图里看到SpriteAtlases文件夹,在此文件夹下看到精灵贴图和精灵数据文件。

我们需要在Unity里做些修改让它看起来正确。
  • 在项目视图里选择player.png,在Inspector 中将Filter Mode改为Point。
  • 点击Override for Web,将Format设置成Truecolor,然后点击Apply。

制作主角精灵


我们用Orthello 2d将主角精灵图集变为动画精灵。

精灵容器:
  • 在unity的项目视图,点开orthello:Orthello –> Objects –> Sprites –> SpriteAtlas,然后将SpriteAtlas-Cocos2D拖到Hierarchy中。
  • 在Hierarchy窗口,点开OT->Containers,你会发现出现了一个新的Container,名字类似Container (id=-6840)“,这个Container将会包容我们关卡需要的所有的精灵,所有我们可以命名它为“player”。
  • 将“player.png”拖放到“OTSprite Atlas Cocos 2D” 脚本的Texture位置。
  • 将“player.xml”拖放到“OTSprite Atlas Cocos 2D” 脚本的Atlas Data File位置。

建立主角动画:
  • Animation对象拖到Hierarchy中Orthello –> Objects –> Sprites,这将会在OT –> Animations下添加一个新的对象,名字类似“Animation (id=-4320)“,将其重新命名为“player anims”。
  • 点选刚创立的动画对象,将设置修改为下图所示的。
  • Framesets下,将Size设置为9.
  • 为了填充Container区域,将OT –> Containers下的player拖放进去。



制作主角精灵

  • 然后将Orthello –> Objects –> Sprites下的AnimatingSprite拖放到Hierarchy中,这会给场景添加一个新的对象,名字类似“Animating Sprite (id=-23050)“。将名字改为“player“。
  • 将“player anims”拖放到“player”的Animation位置。Sprite Container位置会被自动填上“player”容器对象。如果没有,你可以自己将“player”容器对象拖放到此位置。
  • 此时你应该看到player精灵在场景中,如果你播放,你会看到player的动画在一直播放。但我们不希望动画在一开始就播放,所以将Play On Start的勾选去掉。

给主角添加碰撞检测


为了使主角能正确的和梯子绳子进行碰撞,我们需要做以下设置:

  • 选中player,勾选“OTAnimating Sprite”下的Collidable,这会给对象自动添加一个Rigidbody。
  • 点开Physics旁的下拉菜单,选择Custom。
  • 在Transform中,将Scale Z设为1.
  • 将Depth改为-1.
  • 在Box Collider中,将Center Y改为-0.1,Z改为1. 将Size X改为0.45, Y改为0.6,Z改为0.4.


如果你按照上面的步骤去做了,那么你将得到下面图示结果:



将Depth改为-1以及将Box Colider的Z改为1,这会使主角靠近摄像机一些,使碰撞器在Z轴的0位置。这样做有两个效果:首先可以保证主角始终在关卡背景的前面而不会被挡住,其次保证碰撞器在Z轴的0位置使之可以和梯子绳子进行碰撞。这听起来玄乎,但是你看看下图就明白是怎么回事了:



设置射击动画


我们需要添加另外一个动画,当我们按下开火键时,会有子弹从主角身上发出,并撞击地面。


制作射击动画

  • 将Orthello –> Objects –> Sprites中的Aniamtion对象拖放到Hierachy中。这会在OT –> Animations下创建一个新的名字类似“Animation (id=-4320)“的对象,将其重命名为“shoot anims”。
  • 点选“shoot anims”对象,将设置设成下图所示。将OT –> Containers下的level容器拖放到Container区域。



制作射击精灵

  • 然后将Orthello –> Objects –> Sprites下的AnimatingSprite拖放到Hierarchy中,这会给场景添加一个新的对象,名字类似“Animating Sprite (id=-23050)“。将名字改为“shoot“。
  • 将“shoot anims”拖放到“shoot”的Animation位置。Sprite Container位置会被自动填上“level”容器对象。如果没有,你可以自己将“level”容器对象拖放到此位置。
  • Transform Position X设置为-1,这样就会使其位置在主角精灵的左侧。
  • 将深度Depth改为-1,这样它始终在关卡背景的前面。
  • Frame Index设置为18.
  • 此时你应该看到shoot精灵在场景中,如果你播放,你会看到shoot的动画在一直播放。但我们不希望动画在一开始就播放,所以将Play On Start的勾选去掉。
  • 我们只希望在主角真的发射子弹时子弹才出现,所以我们把Mesh Render给勾掉,隐藏子弹动画,直到我们用脚本来重新打开它。


给子弹精灵加个父节点


我们希望子弹精灵跟随者主角,我们也希望能根据主角的面向来左右翻转这个精灵。

  • 创建空对象Object –> Create Empty。
  • 将其命名为shoot parent”,并是Position在0、0、0位置。
  • 在Hierarchy中,将shoot精灵拖放到shoot parent上,使shoot成为shoot parent的子节点对象。
  • 将shoot parent对象拖放到player精灵上,使之成为player精灵的子节点对象。

如果你按照我的步骤,你的Hierarchy就跟下图差不多。注意,为了使结构更紧凑,我把所有level相关的对象都放到了一个名为“LEVEL”的空对象下了。


注意:为了使后面的脚本能正确的工作,player下的子节点对象的名字一定要和上图中的一模一样。


添加脚本


我们终于要添加脚本来使主角移动了。

  • Download the player scripts下载脚本,解压到你电脑硬盘中。
  • 将里面的脚本拖放到项目的Asset文件夹里。
  • 创建一个空游戏对象Game Object –> Create Empty。
  • 将新对象命名为“Scripts”。
  • xa.cs脚本文件拖放到Scripts对象上。
  • player.csplayerAnims.cs脚本文件拖放到player对象上。
  • 确保主角站在一个砖上,这样他不会掉下去。要记住,实际上是主角的Box Collider和其它物体碰撞,而不是可见主角精灵,所以要使主角的位置像0,0,-1(x,y无所谓,但是z一定要保持在-1)。

好了,如果你按照了以上所有步骤,那么此时当你播放这个游戏,你会发现主角能够站在砖上而不会掉下去了。并且当你按键盘上的左右方向键时主角会跟着移动,而且还有动画。

本教程并不解释脚本如何工作的,但是我在脚本里做了注释,希望能帮到你。如果你有任何的疑问,你可以在回复中提问,也可以给我email。


给梯子加碰撞


创建一个梯子碰撞体

  • 创建一个Cube,GameObject –> Create Other –> Cube。
  • 将Cube命名为“Ladder”。
  • 打开Tag Manager,Edit –> Project Settings –> Tags。
  • 创建“Ladder”和“Rope”两个Tag。
  • 让我们再创建一个层Layer “NoDraw”。
  • 现在将Ladder对象的Tag改为Ladder,Layer改为NoDraw。

在游戏视图中隐藏梯子碰撞体

  • 点击Main Camera。
  • 在Camera下面,打开Culling Mask下拉菜单,点掉NoDraw。这样在NoDraw层的物体都不会在游戏视图里看到了。


调整梯子碰撞体的大小和位置


梯子碰撞体需要比可见的梯子大一个单元,这就是说,如果你的梯子有4块拼图片高,那么碰撞体得有5个高。

  • 假设你的梯子有4个单位高:选择Ladder碰撞体,将Scale Y改为5.
  • 使用Vertex Snap将Ladder与梯子的底部拐角对齐。
  • 你可以复制这个Ladder,然后与其他梯子对齐。

你的Ladder应该跟下图所示一样:



现在你按Play,当主角碰到梯子时,可以上下爬梯子了,可以从梯子的上下两端走出,如果你从梯子中间走出去,也可以从梯子的中间掉下来。


给绳子加碰撞


创建一个绳子碰撞体

  • 创建一个Cube,GameObject –> Create Other –> Cube。
  • 将Cube命名为“Rope”。
  • 现在将Rope对象的Tag改为Rope,Layer改为NoDraw。


调整绳子碰撞体的大小和位置


绳子碰撞体需要比可见的绳子大一个单元,这就是说,如果你的绳子有4块拼图片长,那么碰撞体得有5个长。

  • 假设你的绳子有4个单位长:选择Rope碰撞体,将Scale X改为5.
  • 使用Vertex Snap将Rope与绳子的底部拐角对齐。
  • 你可以复制这个Rope,然后与其他子对齐。

你的Rope应该跟下图所示一样:


现在你按Play,当主角碰到绳子时,可以左右爬绳子了,可以从绳子的左右两端走出,如果你从绳子中间走出去,也可以从绳子的中间掉下来。


结尾


现在已经完成了主角的所有移动动作了:跑、爬梯子和绳子。下一讲我们将加入计分系统、打破砖块和捡起物体。


你可以下载本项目download the project up to this point,也可以试玩本项目play the web version of the project here.


如果你喜欢,请回复这篇博客,并关注我的TwitterFacebook。你的支持会帮助这个教程的持续进行。这个博客是iDevBlogADay的一部分,这里面收集了一系列程序员开发的经验。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics