原文地址: 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一样的了。
如果你点击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.cs 和 playerAnims.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,然后与其他绳子对齐。
现在你按Play,当主角碰到绳子时,可以左右爬绳子了,可以从绳子的左右两端走出,如果你从绳子中间走出去,也可以从绳子的中间掉下来。
结尾
现在已经完成了主角的所有移动动作了:跑、爬*和绳子。下一讲我们将加入计分系统、打破砖块和捡起物体。
你可以下载本项目 download the project up to this point,也可以试玩本项目 play the web version of the project here .
如果你喜欢,请回复这篇博客,并关注我的 Twitter和 Facebook。你的支持会帮助这个教程的持续进行。这个博客是iDevBlogADay的一部分,这里面收集了一系列程序员开发的经验。