http://bbs.9ria.com/thread-402710-1-1.html

在这个系列,我们将关注Unity引擎提供的基于骨骼动画工具。它的主要思想是为了把它应用到你自己的游戏来介绍和教基本的2D动画原理。在这节课中,我们将添加闲置,跳跃和动画。

在开始这个课程前,我们将感谢Chenguang (DragonBonesTeam)给我们提供用于本系列教程游戏艺术。

离开的地方

在 上一个课程,我们启动项目,合成2D龙角色,然后创建三种不同的动画。如果你还没完成之前的课程,在此之前,我们强烈建议您这样做。

预览效果

这个demo演示了龙的动画,我们的目标是 –点击Space键就跳:

点击查看

Mecanim

这时候,你的龙已经完全合成并且做出了三种定义的动画。然而,他们之间还没有连接。所以,我们最初的的目标是连接不同的动画影片剪辑和混合在一起。为了达到这个目标,Unity提供你正需要的一个非常棒的工具,叫做Mecanim。

Mecanim是一个功能强大且灵活的动画系统。因为它与Unity本身集成,所以不需要第三方的软件。你可以轻松改变任何东西,从精灵变成混合的形状,甚至是灯。Mecanim允许创建状态机和混合数来控制你的角色。

但是,在继续下去之前,让我们讨论一下关于混合动画和状态机,让我们有一个更好的了解我们要做什么。

状态机是什么?

在Unity里,你可以混合两种或者更多的相似动画 ――举个例子来说,你想把跑步和步行的动画依靠角色当前的速度混合到一起。基本上,在Unity中有两种不同的方法可以混合动画。在一些情况下,你可能想要使用过渡,在其他情况下可能你需要使用混合树:

· 过渡常常是用在动画之间的自然过渡。这通常适用于是否快速过渡。

· 当合并部分的数量变量是,混合树允许在多种动画顺利融合。给一个实际的例子,假设有一个射击游戏,你可能想要你的角色跑着开枪。混合树允许你将两种动画混合到一起,不需要为这个特定动作的混合物创建第三种动画,就能让角色跑着开枪。

在给定的时间,一个状态机存储的状态实体,并且能够对一个输入改变实体的状态,活导致一个行动或者输出。有关更多消息请参见有限状态机理论和实现

在Unity,你使用状态机来控制游戏角色的状态。举个例子,角色的一种状态叫walk,另一种状态叫Jump。一个角色从Walk的状态变成Jump的状态取决于播放器的输入(可能是通过点击Jump按钮)。

在这里你可以从Unity文旦中。看到一个例子(更复杂)的状态机。每一个箱子表示一个状态,它们之间的箭头表示可能的转换:

我们将要用我们存在的动画创建一个状态机,然后使用过渡来把它们混合起来。

创建我们的状态机

如果你检查一下Animations文件夹,你可以在Dragon.controller文件下看到已经保存为.anim文件。这些mecanim文件与角色关联,Unity保存在你第一个动画自动生成的地方。

双击 Dragon.controller 文件,Unity将打开在场景和游戏选项卡之间动画视图的选项卡。

正如你所看到的,Unity已经添加这三种动画到文档中了。因为动画已经在那里了,所以不需要添加,但是,如果你想添加额外的动画到控制器,你只需要把.anim文件拖拽到Animator视图中。同样的,如果你想移除已经存在控制器的动画,你只需要相中Animator视图,然后点击Delete按钮即可。随时可以自己试一下这个。

在Animator中有四种不同的盒子:

· 任何状态

· 闲置

· 跳跃

· 下降

任何状态是mecanim创建的一种默认状态,你不能使用它。你可以把它拖拽到Animator窗口的任何角落下,然后放在哪里。

其他三种盒子使我们关于我们创建的三个动画。你可能会注意到,Idle是橙色的,其他两个是灰色的。这是因为idle是主动画,这是角色默认播放的动画。如果你在编辑器中点击Play按钮,然后测试它,你就可以看到角色的Idle动画。在这种特殊情况下,这确实是我们想要的行为。然而,如果你想要说Fall动画成为主动画,你需要做的就是单击右键选择设置为默认。

可以看到,现在Fall动画是橙色,idle是灰色的。

因为你想要idle成为主动画,仅仅只需要重复这个过程是颜色变为橙色即可。

现在是连接动画的时候了。右击Idle,然后选择 Make Transition。

这会在Idle这个创建一个小箭头。点击Jump动画来制作一个箭头来连接两个动画。

如果你选择你刚刚创建的箭头,你将会看到在Inspector选项卡中会显示一个新的属性。

你可以看到,有一个时间轴,还有Ilde和Jump动画。在Idle动画的开始有一个蓝色带,但是后来变成Jump。同样的,在这两个动画之间有一段重叠的时间。

因为预览区域是空白的,即时你点击了预览的Play按钮,也不能看到什么变化。

为了预览现在做的过渡,只需要选中层级视图的选项卡中Dragon游戏物体,并把它拖拽到预览区域即可。现在你可以看到角色的预览,如果点击play按钮,你就可以看到两个动画之间的过渡。

在监控器中,看到Idle到Jump转变的蓝色带区域就是过渡:

在过渡区域,你可以通过拖拽时间轴上蓝色箭头来编辑过渡。通过改变它们的位置,你可以让过渡变得更加快和平缓。

接下来你可以定义你什么时候想让过渡发生。为了达到这个目标,通过点击在Parameters 列表下的+标志创建一个新的参数。

接下来,选择Float选项并叫为VerticalMovement:

现在,返回到Inspector,在 Conditions下会显示一个VerticalMovement值,然后选择它。

你刚刚定义的条件是来确定何时改变状态机的状态:如果VerticalMovement的值比0大,那角色就会开始Jump的动画。

我们也需要Jump动画到Fall动画的过渡:

VerticalMovement的最大值将达到1,因此,为了Jump到Fall的过渡,需要把值设置低于0.5.

现在我们需要在Fall之后设置角色返回到Idle。因为idle播放时角色应该是在地板上,我们应该创建一个从Fall到Idle的过渡。

为了完成,你必须确保活动时角色是在地面上的。为了达到这个效果可以通过设置VerticalMovement 过渡参数低于0.1—这基本上意味着的VerticalMovement值为0,表示角色在地面上。

我们需要确保在空中Jump到Fall动画直接角色没有出现Idle动画。为了达到这个效果,还需要创建一个新的参数,这次是一个布尔Bool。

把它叫做OnGround。

选中Jump到Fall之间的过渡。你要这个角色的过渡依旧是在空中,对吗?所以到Inspector,点击+,然后在过渡中添加一个新的参数。从根本上上讲,当的OnGround值为
false时你想要的这样的事情就可以发生

。 

接下来,从Fall到Idle的动画过渡,添加参数 OnGround
并设置为true。

我们做的Mecanim开始动了。现在是到我们的脚本了。

脚本动画

在你的asset目录下,创建一个叫Scripts的文件夹。接下来,创建一个名为CharacterMove.cs新的C#脚本。请注意,你现在创建的脚本是一个非常简单的,它的主要目标就是显示如何通过代码改变角色的动画。

当你想要创建一个健壮的游戏,最好的实践就是使用Unity本身。然而,为了简单起见和理解,我们将创建一个小的模拟。

在脚本中创建四个变量:一个是Animator组件,另一个是下降的速度,第三个是垂直运动,和一个标记检查角色是否在地上。

  1. 在Start()方法中,我们需要确保速度设置为0.03(或者你举得适合动画的值)并且角色在地面上。void Start () {
  2. // The character starts on the ground
  3. onGround = true;
  4. // Set the fall speed
  5. fallSpeed = 0.03f;
  6. }

复制代码

现在,在 Update() 方法中,有几个地方需要检查。第一,你需要检测当空格键被点击时,角色在跳。当它被按下时,设置水平运动为1和onGround 标志为false。

  1. void Update () {
  2. // If the space bar is pressed and the character is on the ground
  3. if (Input.GetKeyDown(KeyCode.Space) == true && onGround == true)
  4. {
  5. verticalMovement = 1f;
  6. onGround = false;
  7. }
  8. }

复制代码

如果不是空格键被按下呢?非常好,你需要检测角色在空气中和它的水平运动大于0;如果这样的话,你需要通过减少下降速度来减少水平运动。

  1. void Update () {
  2. // If the space bar is pressed and the character is on the ground
  3. if (Input.GetKeyDown(KeyCode.Space) == true && onGround == true)
  4. {
  5. verticalMovement = 1f;
  6. onGround = false;
  7. }
  8. else
  9. {
  10. // Check if the character is in the air and the vertical movement greater than 0
  11. if(onGround == false && verticalMovement > 0)
  12. {
  13. // Reduce vertical movement
  14. verticalMovement -= fallSpeed;
  15. }
  16. }
  17. }

复制代码

你要记得,一旦verticalMovement 低于0.5,Fall动画将开始播放。

然而,你永远不想从verticalMovement 减去fallSpeed ,因为这个角色将会回到地面上。如果水平运动的值等于或者小于0,这意味着角色将抵达地面上。

  1. void Update () {
  2. // If the space bar is pressed and the character is on the ground       if (Input.GetKeyDown(KeyCode.Space) == true && onGround == true)        {
  3. verticalMovement = 1f;
  4. onGround = false;
  5. }
  6. else
  7. {
  8. // Check if the character is in the air and the vertical movement greater than 0
  9. if(onGround == false && verticalMovement > 0)
  10. {
  11. // Reduce vertical movement
  12. verticalMovement -= fallSpeed
  13. // If the vertical movement is less or equal to 0, the character is on the floor
  14. if (verticalMovement < 0)
  15. {
  16. verticalMovement = 0;
  17. onGround = true;
  18. }
  19. }
  20. }
  21. }

复制代码

在Update() 方法的结尾,你需要把verticalMovement和onGround 的值传递给Animator组件。

  1. void Update () {
  2. // If the space bar is pressed and the character is on the ground
  3. if (Input.GetKeyDown(KeyCode.Space) == true && onGround == true)
  4. {
  5. verticalMovement = 1f;
  6. onGround = false;
  7. }
  8. else
  9. {
  10. // Check if the character is in the air and the vertical movement greater than 0
  11. if(onGround == false && verticalMovement > 0)
  12. {
  13. // Reduce vertical movement
  14. verticalMovement -= fallSpeed;
  15. // If the vertical movement is less or equal to 0, the character is on the floor
  16. if (verticalMovement < 0)
  17. {
  18. verticalMovement = 0;
  19. onGround = true;
  20. }
  21. }
  22. }
  23. // Update the animator variables
  24. anim.SetFloat("VerticalMovement", verticalMovement);
  25. anim.SetBool("OnGround", onGround);
  26. }

复制代码

脚本完成了。现在,你需要把它添加到Dragon游戏物体上,并添加到Animator组件的引用。为了完成这个,一旦你添加脚本,脚本Animator拖拽到的合适字段上。

如果你点击Play按钮并测试,动画应该像他们想象的改变。龙开始是闲置状态,但是一旦你点击空格键,它就会跳上来接着播放下降动画,然后恢复到之前的闲置状态。

外部的工具和技术

尽管这个课程中我们仅仅使用到Unity默认的工具,在Unity资源存储中有很多非常好的2D工具来帮助你使这个制作过程更容易和更快。

这样的插件提供一些配件,像添加2D“骨骼”的能力,是整个动画制作过程更容易和变形更现实。如果你的想法是利用一些细节2D动画,我们强烈建议你去看看这些插件。

总结

我们这一系列关于如何在Unity创建基于骨骼2D动画的教程到此结束。我们涉及到很多简短的系列,你现在应该知道的足以开始你的2D动画。如果你有一些问题或者评论,和往常一样,随时在评论给我们写道。

参考资料

龙精灵表:从Chenguang 的DragonBonesTeam获得适用权限

原文链接:http://gamedevelopment.tutsplus.com/tutorials/bone-based-unity-2d-animation-mecanim-and-scripting--cms-21367

Unity2d 骨骼动画3:介绍Mecanim和脚本的更多相关文章

  1. Unity2d 骨骼动画1:介绍

    http://bbs.9ria.com/thread-401613-1-1.html by Orlando Pereira and PedroPereira3 days ago2 Comments 在 ...

  2. Unity3D Mecanim 动画系统骨骼动画问题解决方法

    http://7dot9.com/2014/08/16/unity3d-mecanim%E5%8A%A8%E7%94%BB%E7%B3%BB%E7%BB%9F%E9%AA%A8%E9%AA%BC%E5 ...

  3. 关于Cocos Creator用js脚本代码播放骨骼动画的步骤和注意事项

    步骤: 1.用cc.find()方法找到相应的骨骼动画节点,并把这个对象赋值给一个var出来的新对象. 具体代码:var spineboy_anim = cc.find("UI_Root/a ...

  4. 基于Babylon.js编写简单的骨骼动画生成器

    使用骨骼动画技术可以将网格的顶点分配给若干骨头,通过给骨头设定关键帧和父子关系,可以赋予网格高度动态并具有传递性的变形 效果.这里结合之前的相关研究在网页端使用JavaScript实现了一个简单的骨骼 ...

  5. Unity 2D骨骼动画2:创建真实动画

    http://bbs.9ria.com/thread-401781-1-1.html 在这个系列,我们将关注Unity引擎提供的基于骨骼动画工具.它的主要思想是为了把它应用到你自己的游戏来介绍和教基本 ...

  6. 2D骨骼动画工具DragonBones的使用教程

    怎样用更少的美术成本创造出更生动的动画效果?今天就为大家介绍一套开源的2D骨骼动画框架和工具--DragonBones,它包含了桌面骨骼动画制作工具DragonBonesPro和一套多语言版本的Dra ...

  7. cocos2dx骨骼动画Armature源码分析(三)

    代码目录结构 cocos2dx里骨骼动画代码在cocos -> editor-support -> cocostudio文件夹中,win下通过筛选器,文件结构如下.(mac下没有分,是整个 ...

  8. cocos2dx骨骼动画Armature源码分析(二)

    flash中数据与xml中数据关系 上篇博文从总体上介绍了cocos2dx自带的骨骼动画,这篇介绍一下导出的配置数据各个字段的含义(也解释了DragonBone导出的xml数据每个字段的含义). sk ...

  9. cocos2dx骨骼动画Armature源码分析(一)

    源码分析一body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-to ...

随机推荐

  1. 让EasyDarwin只支持RTP over TCP传输

    我们经常需要EasyDarwin服务器支持公网流媒体传输,但很多时候,播放器默认都是通过RTP over UDP的形式在RTSP SETUP中请求,往往都以在内网接收不到UDP数据失败结束,那么我们如 ...

  2. r testifying that your code will behave as you intend.

    https://github.com/stretchr/testify Testify - Thou Shalt Write Tests    Go code (golang) set of pack ...

  3. 看不懂JDK8的流操作?5分钟带你入门(转)

    在JDK1.8里有两个非常高级的新操作,它们分别是:Lambda 表达式和 Stream 流. Lambda表达式 让我们先说说 Lambda 表达式吧,这个表达式最大的作用就是简化语法,让代码更加易 ...

  4. DuiLib笔记之CDuiString的bug

    在C/C++中,当使用==比较两个对象时,推荐的风格是将常量置前 例如 if (0 == variable) { ... } 但在DuiLib中,CDuiString存在一个bug:在用==进行比较时 ...

  5. mongodb学习之:数据库命令以及固定集合

    如何我们要删除一个集合,可以采用db.test.drop()的方式,其实在这背后,这个函数运行的是drop命令.可以用runCommand达到同样的效果. 我们首先新建一个集合作为测试使用: > ...

  6. Ubuntu增加Swap分区大小

    参考:http://blog.csdn.net/mznewfacer/article/details/7334592 以下摘自上述地址内容,并做了点小修改: 1.首先用命令free查看系统内 Swap ...

  7. SCAU 还有两个东西 —— 异或

    竞赛题 F  还有两个东西 Time Limit:400MS  Memory Limit:65535K 题型: 编程题   语言: 无限制 描述 给出n( n >= 2 )个整数,其中有 2 个 ...

  8. SDK Manager中勾选项

    运行SDK Manager 勾选对应版本的SDK,从这里基本可以知道一个Android版本对应着一个版本的API. 其中每个包都有这么几个文件: Documentation for Android S ...

  9. UEBA——通过用户画像识别安全威胁

    UEBA and Machine Learning - Download Free Guide for CISOs‎ Adinfo.niara.com/UEBA/Guide-For-CISOs‎ Le ...

  10. Centos下Docker安装与使用的相关命令

    sudo yum install -y yum-utils device-mapper-persistent-data lvm2 systemctl docker status yum-config- ...