怎样创建unity3d人物动画呢?今天我们就来学习这个过程。
 制作主角的精灵图集
如果你跟着我这个教程,你肯定会为主角的移动而兴奋,因此我们用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的设置就如下图所示:

unity人物动画创建

如果你点击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拖放进去。

unity人物动画创建

 制作主角精灵
然后将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.

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

unity人物动画创建

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

unity人物动画创建

 设置射击动画

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

unity人物动画创建

 制作射击动画
将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”的空对象下了。

unity人物动画创建

注意:为了使后面的脚本能正确的工作,player下的子节点对象的名字一定要和上图中的一模一样。
 添加脚本
我们终于要添加脚本来使主角移动了。
下载脚本,解压到你电脑硬盘中。
将里面的脚本拖放到项目的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应该跟下图所示一样:

unity人物动画创建

现在你按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应该跟下图所示一样:

unity人物动画创建

现在你按Play,当主角碰到绳子时,可以左右爬绳子了,可以从绳子的左右两端走出,如果你从绳子中间走出去,也可以从绳子的中间掉下来。
 结尾
现在已经完成了主角的所有移动动作了:跑、爬梯子和绳子。可以试玩本项目 play the web version of the project here.