1. 首页菜单

unity人物动画创建

2015年01月17日 13:54 0 点赞 0 评论 更新于 2025-11-21 14:37

在本教程中,我们将详细介绍如何在Unity 3D中创建人物动画,包括主角精灵图集的制作、动画精灵的创建、碰撞检测的设置、射击动画的添加以及脚本的编写等内容。

制作主角的精灵图集

如果你按照本教程操作,你会为最终主角的移动效果感到兴奋。首先,我们使用TexturePacker来制作一个精灵图集。

  1. 下载并解压源精灵文件:下载源精灵的 .png 文件,并将其解压到项目中。如果你在之前的步骤中已经完成此操作,则可以跳过这一步。
  2. 打开TexturePacker并导入文件:打开TexturePacker,将 sprites/player 目录下的所有 .png 文件拖到Sprites面板中。
  3. 设置纹理参数
    • 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 文件夹下看到精灵贴图和精灵数据文件。

  1. 在Unity中调整精灵设置:在项目视图中选择 player.png,在Inspector中将 Filter Mode 改为 Point。点击 Override for Web,将 Format 设置为 Truecolor,然后点击 Apply。

制作主角精灵

接下来,我们使用Orthello 2D将主角精灵图集转换为动画精灵。

精灵容器

  1. 在Unity的项目视图中,依次点击 orthello -> Orthello -> Objects -> Sprites -> SpriteAtlas,然后将 SpriteAtlas - Cocos2D 拖到Hierarchy中。
  2. 在Hierarchy窗口中,点击 OT -> Containers,会出现一个新的Container,其名称类似 Container (id=-6840),将其命名为 player,该Container将包含关卡所需的所有精灵。
  3. 将 player.png 拖放到 OTSprite Atlas Cocos 2D 脚本的 Texture 位置。
  4. 将 player.xml 拖放到 OTSprite Atlas Cocos 2D 脚本的 Atlas Data File 位置。

建立主角动画

  1. 将 Animation 对象(路径为 Orthello -> Objects -> Sprites)拖到Hierarchy中,这将在 OT -> Animations 下添加一个新对象,名称类似 Animation (id=-4320),将其重命名为 player anims。
  2. 选中刚创建的动画对象,进行如下设置:
    • 在 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 容器对象拖放到此位置。 取消勾选 Play On Start,以防止动画在游戏开始时自动播放。

给主角添加碰撞检测

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

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

将 Depth 改为 -1 以及将 Box Collider 的 Z 改为 1,可以使主角靠近摄像机,保证主角始终在关卡背景前面,且碰撞器在Z轴的0位置,从而能与梯子和绳子进行碰撞。

设置射击动画

制作射击动画

  1. 将 Orthello -> Objects -> Sprites 中的 Animation 对象拖放到Hierarchy中,在 OT -> Animations 下会创建一个新对象,名称类似 Animation (id=-4320),将其重命名为 shoot anims。
  2. 选中 shoot anims 对象,进行设置并将 OT -> Containers 下的 level 容器拖放到 Container 区域。

制作射击精灵

  1. 将 Orthello -> Objects -> Sprites 下的 AnimatingSprite 拖放到Hierarchy中,为场景添加一个新对象,名称类似 Animating Sprite (id=-23050),将其改名为 shoot。
  2. 将 shoot anims 拖放到 shoot 的 Animation 位置,Sprite Container 位置会自动填充为 level 容器对象。若未自动填充,可手动将 level 容器对象拖放到此位置。
  3. 将 Transform Position X 设置为 -1,使射击精灵位于主角精灵的左侧。
  4. 将 Depth 改为 -1,确保射击精灵始终在关卡背景前面。
  5. 将 Frame Index 设置为 18。
  6. 取消勾选 Play On Start,防止动画在游戏开始时自动播放。
  7. 取消勾选 Mesh Render,隐藏子弹动画,直到通过脚本重新打开。

给子弹精灵添加父节点

为了让子弹精灵跟随主角,并能根据主角的面向进行左右翻转,需要进行以下操作:

  1. 创建一个空对象(Object -> Create Empty),将其命名为 shoot parent,并将其 Position 设置为 (0, 0, 0)。
  2. 在Hierarchy中,将 shoot 精灵拖放到 shoot parent 上,使其成为 shoot parent 的子节点对象。
  3. 将 shoot parent 对象拖放到 player 精灵上,使其成为 player 精灵的子节点对象。

注意,为了使后面的脚本能正确工作,player 下的子节点对象的名称必须与教程中的一致。

添加脚本

现在,我们要添加脚本来实现主角的移动。

  1. 下载脚本并解压到电脑硬盘中。
  2. 将脚本文件拖放到项目的 Asset 文件夹中。
  3. 创建一个空游戏对象(Game Object -> Create Empty),将其命名为 Scripts。
  4. 将 xa.cs 脚本文件拖放到 Scripts 对象上。
  5. 将 player.cs 和 playerAnims.cs 脚本文件拖放到 player 对象上。
  6. 确保主角站在一个砖上,主角的 Box Collider 会与其他物体碰撞,而不是可见的主角精灵。主角的 Z 坐标应保持在 -1(x 和 y 坐标可根据需要调整)。

完成以上步骤后,播放游戏,你会发现主角能够站在砖上,按键盘上的左右方向键时主角会移动并显示动画。

给梯子和绳子添加碰撞

给梯子加碰撞

创建梯子碰撞体

  1. 创建一个Cube(GameObject -> Create Other -> Cube),将其命名为 Ladder。
  2. 打开 Tag Manager(Edit -> Project Settings -> Tags),创建 Ladder 和 Rope 两个 Tag。
  3. 创建一个新的层 Layer,命名为 NoDraw。
  4. 将 Ladder 对象的 Tag 改为 Ladder,Layer 改为 NoDraw。

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

点击 Main Camera,在 Camera 下打开 Culling Mask 下拉菜单,取消勾选 NoDraw,这样 NoDraw 层的物体将不会在游戏视图中显示。

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

梯子碰撞体需要比可见的梯子大一个单元。例如,若梯子有4块拼图片高,则碰撞体应为5个单元高。选择 Ladder 碰撞体,将 Scale Y 改为 5,使用 Vertex Snap 将其与梯子的底部拐角对齐。你可以复制该 Ladder 碰撞体并与其他梯子对齐。

播放游戏,当主角碰到梯子时,即可上下爬梯子,还能从梯子的上下两端走出,若从梯子中间走出,也会从中间掉落。

给绳子加碰撞

创建绳子碰撞体

创建一个Cube(GameObject -> Create Other -> Cube),将其命名为 Rope,并将其 Tag 改为 Rope,Layer 改为 NoDraw。

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

绳子碰撞体需要比可见的绳子大一个单元。例如,若绳子有4块拼图片长,则碰撞体应为5个单元长。选择 Rope 碰撞体,将 Scale X 改为 5,使用 Vertex Snap 将其与绳子的底部拐角对齐。你可以复制该 Rope 碰撞体并与其他绳子对齐。

播放游戏,当主角碰到绳子时,即可左右爬绳子,还能从绳子的左右两端走出,若从绳子中间走出,也会从中间掉落。

结尾

至此,我们已经完成了主角的所有移动动作,包括跑、爬梯子和绳子。你可以点击下面的链接试玩本项目: play the web version of the project here

如果你在操作过程中有任何疑问,可以在回复中提问,也可以通过email联系我。