Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)


文章目录

        • 16.1 动画混合树BlendTree
        • 16.2 具体流程
          • 16.2.1 导入模型
          • 16.2.2 打开Animator编辑器
          • 16.2.3 创建混合树Blend Tree
          • 16.2.4 进入混合树
          • 16.2.5 混合树重命名
          • 16.2.6 退出混合树
          • 16.2.7 混合树变量
          • 16.2.8 给混合树添加动画(Motion)
          • 16.2.8 调整混合树中不同动画过渡的临界值
          • 16.2.9 测试混合过渡
          • 16.2.10 使用代码设置Animator变量

简介:我是一名Unity游戏开发工程师,皮皮是我养的猫,会讲人话,它接到了喵星的特殊任务:学习编程,学习Unity游戏开发。
于是,发生了一系列有趣的故事。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

16.1 动画混合树BlendTree 【Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)】上次做了一个打字机游戏给皮皮。
前情回顾:《学Unity的猫》——第十三章:Unity使用Animator控制动画播放,皮皮猫打字机游戏
我:“上次那个打字机游戏有个逻辑可以优化一下。”
皮皮:“我觉得你可以把难度再加大十倍。”
猫族果然有种族优势,现在打字速度已经远超于我。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

我:“我想说的是,动画控制的逻辑可以优化一下。”
皮皮:“我记得你是用Animator组件来控制动画的。”
我:“是的,打字速度快,连击达到一定数量后,动画状态从慢走变成快跑,这里可以使用混合树来控制。”

皮皮:“什么是混合树呀?”
我:“混合树可以很方便地通过变量控制多个动画的混合效果,比如角色的idle(站立)、walk(慢走)、run(快跑)。”
idlewalkrun三个动画独立效果如下:
idle
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

walk
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

run
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

我们想要通过一个速度变量movespeed来混合这三个动画,这个时候就可以使用混合树。
最终效果如下:

16.2 具体流程 16.2.1 导入模型 从AssetsStore下载一个带动画的模型,比如这个猫女孩
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

资源地址:https://assetstore.unity.com/packages/2d/characters/fancydoll-c000-little-cat-girl-112776
将模型导入Unity工程中。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

16.2.2 打开Animator编辑器 点击菜单Window -> Animation -> Animator
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

即可打开Animator编辑器,界面没有显示内容是因为我们没有选中.controller文件。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

选中.controller文件。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

即可看到具体的动画状态机。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

16.2.3 创建混合树Blend Tree 在Animator编辑器界面空白处鼠标右键点击Create State -> From New Blend Tree
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

即可创建一棵混合树。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

选中它,可以在Inspector窗口中对节点进行重命名,比如重命名为MoveBlendTree
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

16.2.4 进入混合树 鼠标双击混合树节点,可以进入混合树内部。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

混合树内部如下
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

16.2.5 混合树重命名 我们可以对混合树进行重名名。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

重命名后
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

16.2.6 退出混合树 点击顶部栏的Base Layer即可退出当前的混合树。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

退出成功
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

16.2.7 混合树变量 创建混合树时,会自动创建一个float类型的变量,可在Paramters标签页中看到,默认变量名为Blend
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

我们可以双击变量,将变量进行重命名,比如重名名为movespeed
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

我们可以设置混合树使用的变量,如下,使用movespeed变量。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

设置成功。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

16.2.8 给混合树添加动画(Motion) 在混合树根节点上右键鼠标,点击菜单Add Motion
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

即可添加一个Motion
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

我们想要混合idlewalkrun三个动画,所以需要三个Motion
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

将具体的Motion设置成具体的动画。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

16.2.8 调整混合树中不同动画过渡的临界值 可以直接拖动混合视图调整临界值Threshold
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

16.2.9 测试混合过渡 调整混合树的movespeed变量,可以看到Motion之间的过渡。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

将混合树节点设置为默认状态
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

将猫女孩模型拖到场景中
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

如下
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

运行Unity,可以看到状态机正常进入混合树种循环。
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

进入混合树节点,调节movespeed变量,可以看到混合过渡效果

16.2.10 使用代码设置Animator变量 上面我们是手动修改movespeed变量,实际运用中,我们很可能需要使用代码来设置。
创建一个Main脚本,代码如下
using UnityEngine; public class Main : MonoBehaviour { public Animator ani; private float m_speed; private float m_interpolation = 1.5f; void Update() { if (Input.GetKey(KeyCode.Space)) { if (m_speed < 1) { m_speed += Time.deltaTime * m_interpolation; if (m_speed > 1) m_speed = 1; ani.SetFloat("movespeed", m_speed); } } else { if (m_speed > 0) { m_speed -= Time.deltaTime * m_interpolation; if (m_speed < 0) m_speed = 0; ani.SetFloat("movespeed", m_speed); } } } }

Main脚本挂到模型预设上,并赋值Ani对象
Unity3D|《学Unity的猫》——第十六集(Unity动画使用混合树BlendTree实现动画过渡控制)
文章图片

运行Unity,按下空白键,即可自增movespeed,松开空白键,movespeed就会自减到0。

完成。
如果有什么疑问,欢迎留言或私信。
《学Unity的猫》——第十七集:Unity的UGUI布局,皮皮猫的简历

    推荐阅读